Form 的安全性問題

這陣子在幹壞事的時候才發現國內一些站台都沒有處理好... XD (我絕對沒有說是哪些站喔,自己裝 用他的 View Form Information 看吧 XD)

直接以程式碼舉例。我在我自己的站上放一個 html,裡面有一個 form 與一段 javascript,會自動 submit 出去:


<form
 action="http://dingding.example.org/delete-my-account.php"
 id="myform" method="post" name="myform">
    <input ... /> (某些需要的欄位)
</form>

<script>
var f = document.getElementById("myform");
f.submit();
</script>

如果網站沒有正確處理,就可以讓別人幫你砍帳號,或是發文章 (Spam 的好方法?),或是其他事情。這是因為瀏覽器連到 dingding.example.org 的時候會帶 cookie 進去。

解法也很簡單,用類似 Double Cookie 的方式解決。以 為例,產生 form 的時候多送一個 hidden input:


<input type="hidden" name="doublecookie"
 value="<?= md5(session_id()) ?>" >

然後在接收 form 的程式碼裡面判斷:


if (!isset($_POST["doublecookie"]) ||
    $_POST["doublecookie"] != md5(session_id())) {
    // not match, break it
}

你可以看到 就是用類似的方法做的。在 securityToken (被我劃掉的地方) 的地方:(點小圖看 1024x1024 的大圖,不過我為了塞到一頁裡面,字縮小了兩次...)

8 thoughts on “Form 的安全性問題”

  1. 如果有分某一長相的 url 全部是 update 的動作的話, 直接從 web server 上對那一區 check referer 也許是最快的做法? :Q

  2. 基本上, CSRF 的利用一定都是針對特定 Web App 的 Target Attack, 所以 Hidden Value 的值仍可能在 CSRF Code 裡面實作並解析 Hidden Value (利用 iframe) 並模擬含Hidden Value格式來發送 Request.

  3. 那如果在form page裡面加javascript
    讓他把自己擺到_top
    這樣能不能解決?

    這實在是太可怕啦~~

Leave a Reply

Your email address will not be published. Required fields are marked *