昨天已經完成了 把來自瀏覽器的 header 轉發給 Github ,而今天要做的是 把來自 Github 的 header 轉發給瀏覽器 ,也就是圖中的第四步
跟昨天一樣先看一下 Github 的回覆裡面到底有哪些 header(多到我必須截兩張圖)
這些大多是安全性的 header,這邊只簡單介紹一下,看不懂也沒關係XD
CSP 是用來 限制瀏覽器只能從某些網域讀取資源 ,譬如說上面 CSP 一大串裡面有 github.com
但沒有 phish-github.com
,那瀏覽器就知道可以從 github.com
讀取資料但不能從 phish-github.com
讀,這樣的限制對我們釣魚網站來說是很大的傷害(我們的釣魚網站突然變成受害者了XD),為了讓網站正常釣魚必須把這個 header 移除
Strict Transport Security 的全名是 HTTP Strict Transport Security(HSTS),用來強制網站一定要使用 HTTPS,但因為現在只是架在 localhost 沒支援 HTTPS,如果有 HSTS 的話會造成我們很大的困擾(好可憐),所以待會只好把它刪掉了
X-Frame-Options: deny
的意思是不允許本網站被嵌入 frame 中,如果不太懂是什麼意思沒關係,簡單來說就是個可以讓網站更安全的 header,對於這種安全性 header 我們一律把它刪掉,反正釣魚網站也不用那麼安全XD
這兩個 header 是用來局部刷新網頁的,跟 AJAX 有點類似,雖然跟安全性比較沒關係,但因為他裡面有 Github 網址可能會在跳頁時引發一些錯誤,所以也先把它刪掉,這邊不說太多他的原理,如果對他有興趣的話可以參考下面的資料
這個 header 是用來保護網站不受 XSS 攻擊的,也是很重要的安全性 header,因為對我們釣魚網站沒什麼助益所以一樣刪掉
在 handler 把 header 轉傳給瀏覽器之前,把上面提到的那些 header 都刪掉,這樣可以讓我們更方便假冒 Github
func handler(w http.ResponseWriter, r *http.Request) {
// ...
body, header, statusCode := sendReqToUpstream(req)
// Set-Cookie 之前已經有複製而且取代 secure, domain 了
// 所以複製除了 Set-Cookie 之外的 header
for k := range header {
if k != "Set-Cookie" {
value := header.Get(k)
w.Header().Set(k, value)
}
}
// 把安全性的 header 統統刪掉
w.Header().Del("Content-Security-Policy")
w.Header().Del("Strict-Transport-Security")
w.Header().Del("X-Frame-Options")
w.Header().Del("X-Xss-Protection")
w.Header().Del("X-Pjax-Version")
w.Header().Del("X-Pjax-Url")
// ...
}
花了兩天終於把 header 都搞定了,實測一下 recent activity 果然跑出來了呢(跟 Day16 開頭比較),所以也可以證實 Github 其實有在判斷某些 header,如果有異狀就直接拒絕請求
今天講了怎麼把 header 轉傳給瀏覽器,因為 Web Security 不是本系列的重點,而且要講的話要花很多時間,所以還是把焦點放在怎麼實作出 一模一樣 的釣魚網站,想要更進一步了解那些 header 可以看看底下的參考資料
這是今天的 commit,連 header 部分都處理好了那應該沒有其他問題了吧?筆者我原本也是這樣以為,想不到在發 issue 時又被 Github 檔掉不能發,不得不說 Github 真的很厲害阿,處處堤防不讓我做好釣魚網站,不過道高一尺魔高一丈,總還是有辦法的,有問題的話歡迎在下方提問,沒有的話那就期待一下明後天的內容吧~