網頁開發除了絢麗的特效,或是 UI/UX之外,還有一個很重要的議題就是安全。

其中一種叫做 open redirect,不算是非常嚴重的漏洞但也是需要注意。

slack 六年前的 hackone report 為例,https://sehacure.slack.com/link?url=http://www.likelo.com 會直接將使用者導到 likelo.com 去,這個例子裡是個網站,但他也可以是下載 exe檔案,或是釣魚網站。

這樣的行為就是在伺服器端沒有針對輸入的變數做檢查,以上面例子來說,就是 url 參數傳進來的值需要檢查。

可以採取的對策有

  1. 避免使用 redirect
    在系統設計上,避免這樣的 redirect。近來直接給予直接的連結,如果是為了記錄使用者點了哪些網址,可以用 js 先 preventDefault,送出 tracking 再轉往頁面
  2. 不要直接接受 URL
    另一種方式就是先用白名單紀錄,這份白名單記錄了預先建立好的網址列表,給予一個代號。常見的網址樣式會是 https://xyz.com/redirect/12345,其中12345是先定義好的 key。
  3. 針對網址做簽章
    再產生網址之時就用私鑰簽章,使用者點擊之後要驗證簽章和網址,確保是由自己簽出。可能會看到的網址會是 https://xyz.com/redirect?url=http://abc.com&sign=jkl,sign 是用來確保連結是由自己服務產生
  4. 加入中繼頁面
    用 facebook點了別人提供的連結,如果是外站(非FB)那就會出現一個頁面確認是否要前往這個網址,這也是一個阻止使用者誤點的方法。

ref:

  1. https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html
  2. https://cwe.mitre.org/data/definitions/601.html