XSRF Attack

安全問題永遠是腦力激盪的競賽...

今天看到一篇文章,主要是在談 Web Application 最常見的安全性問題,它主要講了三個重點:

  • SQL Injection
  • XSS: Cross-Site Scripting
  • XSRF: Cross-Site Request Forgery

其中 SQL InjectionXSS 已經是老生常談了,一些新出版關於 web application development 的好書(如:Agile Web Development with Rails)也都會談論這些安全問題。而這篇文章提到的 XSRF 就好像比較少看到討論...

XSRF 從字面上的意思來看就是「Cross-site 偽造 request」(抱歉,我真的不知道怎麼用中文表達 XD)。假設有一個網路銀行的交易程式如下所示:


# Python script
@expose()
def send_money(self, to_whom, how_much):
# validate that user has enough money
transfer_money(
from_user=identity.current.user.user_id,
to_user=to_whom,
amount=float(how_much))
turbogears.redirect('/')

網路銀行都會有一個表單來呼叫這樣的程式,假設使用者在同一個瀏覽器上(另外一個 tab)連上了一個釣魚網站,然後網站的內容出現一行:



惡意釣魚的網站利用了 這個 tag 來讓你去執行了特定網路銀行的交易程式,如果該網路銀行接受這樣的 request ,那你的錢就會被釣魚網站吸走!也許你會想:「那就讓程式只接受 POST request 就好啦~」但這樣其實也不安全,因為我只要隨便用一個 Prototype.js 裡的 Ajax.Request() 就可以輕易地發出 POST request,所以最好的方式,這篇文章的作者建議是在網頁中放一個 hidden 的 field 來存著只有你網站能產生的檢查碼

另外一種可能的 XSRF attack 可能是這樣:




假設你的網路銀行用 Javascript 來列出你的一些財務資料,然後釣魚網站加入了上面這樣的 code ,那它便能在你網頁讀完之後蒐集到這些資料,像這樣的攻擊前一陣子就成功地攻擊了 GMail (詳情請見這裡),attacker 可以利用這種攻擊方式取得使用者在 GMail 裡的通訊錄資料(目前已修復)。

看來從事 web application 開發工作的人,可是要時常動動腦讓你的 web 更安全,許多教導 web 開發的書籍更應該把安全問題放在書中好好地討論(正好可以利用這樣來評鑑書籍、作者的程度好或壞?)!