CSRF(Cross Site Request Forgery, 跨站域請(qǐng)求偽造) 是一種網(wǎng)絡(luò)的攻擊行為,它可以在受害者毫不知情的情況下以受害者名義偽造請(qǐng)求發(fā)送給受攻擊站點(diǎn),從而在并未授權(quán)的情況下執(zhí)行在權(quán)限保護(hù)之下的操作。具體流程如下實(shí)例(from: http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html)

舉個(gè)例子:比如有個(gè)銀行網(wǎng)址A,對(duì)應(yīng)的轉(zhuǎn)賬請(qǐng)求是transfer?to=***&money=***
1. A登錄a.com網(wǎng)址?
2. B給A發(fā)送了一個(gè)地址fake.com(里面包含了a.com/transfer?to=fakeAccount&money=1000)
3. A在未登出的情況下,訪問了B發(fā)來的fake.com
4. 結(jié)果,A的賬戶里面少了1000,轉(zhuǎn)給了fakeAccount賬戶
攻擊的方式包括get和post請(qǐng)求。get請(qǐng)求可以通過引用靜態(tài)資源發(fā)送,如<img src="a.com/888>"。post請(qǐng)求可以在偽造網(wǎng)站中放入action地址 為a.com的form表單,并在body 的onload事件中發(fā)起提交

防御方案
1. 添加Referer校驗(yàn)。從流程上看,正常發(fā)起的請(qǐng)求和假冒網(wǎng)址上發(fā)起的請(qǐng)求,對(duì)應(yīng)的Refer是不一樣的,可以使用這個(gè)進(jìn)行校驗(yàn)。缺點(diǎn):比如 IE6 或 FF2,目前已經(jīng)有一些方法可以篡改 Referer 值。如果要支持低版本瀏覽器,該方法并不安全。
2. 所有請(qǐng)求添加token參數(shù)。用戶登錄的時(shí)候,后臺(tái)session可以生成一個(gè)token,前端頁面發(fā)起請(qǐng)求的時(shí)候,都要帶token。缺點(diǎn):所有涉及的請(qǐng)求都要被修改。另外,如果頁面上的鏈接都被改成了a.com?token=***這種,那在在一些論壇之類的地方,如果黑客在網(wǎng)站上發(fā)布了一個(gè)地址,該地址可以獲取Referer中的token值,進(jìn)而發(fā)起攻擊
3. 請(qǐng)求頭部添加token。在使用xhr請(qǐng)求的時(shí)候,可以添加一個(gè)自定義頭部,里面包含token的數(shù)據(jù)。缺點(diǎn):如果原系統(tǒng)并不是xhr請(qǐng)求的話,修改工作量非常巨大。
參考:
1.https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/index.html
2.http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html