CSRF(Cross-site request forgery,跨站請(qǐng)求偽造),是通過偽造請(qǐng)求,冒充用戶在站內(nèi)進(jìn)行操作
比如,點(diǎn)擊發(fā)帖后會(huì)進(jìn)行如下GET請(qǐng)求
http://example.com/bbs/create_post.php?title=標(biāo)題&content=內(nèi)容
那么,如果我們模擬了請(qǐng)求的鏈接,那么只要有用戶點(diǎn)擊了這個(gè)鏈接,他就會(huì)在不知情的情況下發(fā)布了這一帖子,那么刪貼,發(fā)郵件等等都可以進(jìn)行偽造
http://example.com/bbs/create_post.php?title=攻擊&content=哈哈
如何防范 CSRF 攻擊
- CSRF 攻擊之所以能夠成功:是因?yàn)楹诳涂梢酝耆珎卧煊脩舻恼?qǐng)求,該請(qǐng)求中所有的用戶驗(yàn)證信息都是存在于 cookie 中,因此黑客可以在不知道這些驗(yàn)證信息的情況下直接利用用戶自己的 cookie 來(lái)通過安全驗(yàn)證
- 所以解決辦法是:在請(qǐng)求中放入黑客所不能偽造的信息,并且該信息不存在于 cookie 之中
- 驗(yàn)證 HTTP Referer 字段
- 關(guān)鍵操作只接受POST請(qǐng)求,因?yàn)镚ET請(qǐng)求的參數(shù)攜帶在URL中,很容易進(jìn)行模擬,而POST請(qǐng)求的參數(shù)在http body中
- 驗(yàn)證碼,每次操作都需要用戶進(jìn)行互動(dòng),從而簡(jiǎn)單有效的防御了CSRF攻擊,但是驗(yàn)證碼太多,也會(huì)影響用戶體驗(yàn)
- 可以在 HTTP 請(qǐng)求中以參數(shù)的形式加入一個(gè)隨機(jī)產(chǎn)生的 token,并在服務(wù)器端來(lái)驗(yàn)證這個(gè) token
- 可以在 HTTP 頭中自定義的屬性里加入一個(gè)隨機(jī)產(chǎn)生的 token,通過XMLHttpRequest,可以給所有請(qǐng)求加上這個(gè)token,通過XMLHttpRequest 請(qǐng)求的地址不會(huì)被記錄到瀏覽器的地址欄,也不用擔(dān)心 token 會(huì)透過 Referer 泄露到其他網(wǎng)站中
注意:過濾用戶輸入的內(nèi)容不能阻擋 CSRF,我們需要做的是過濾請(qǐng)求的來(lái)源
XSS(Cross Site Scripting,跨站腳本攻擊),是注入攻擊的一種,特點(diǎn)是不對(duì)服務(wù)器端造成任何傷害,而是通過一些正常的站內(nèi)交互途徑
例如:發(fā)布評(píng)論,提交含有 JavaScript 的內(nèi)容文本,如果服務(wù)器端沒有過濾或轉(zhuǎn)義掉這些腳本,作為內(nèi)容發(fā)布到了頁(yè)面上,其他用戶訪問這個(gè)頁(yè)面的時(shí)候就會(huì)運(yùn)行這些腳本,或者是一些未授權(quán)的操作
while (true) { alert("你關(guān)不掉我~"); }
在輸入框中輸入document.cookie,可以直接獲得cookie中的內(nèi)容,所以,在重要的cookie參數(shù)中加入httpOnly屬性
XSS 是實(shí)現(xiàn) CSRF 的諸多途徑中的一條,一般習(xí)慣上把通過 XSS 來(lái)實(shí)現(xiàn)的 CSRF 稱為 XSRF
如何防御 XSS 攻擊
理論上,所有可輸入的地方?jīng)]有對(duì)輸入數(shù)據(jù)進(jìn)行處理的話,都會(huì)存在XSS漏洞,防御 XSS 攻擊最簡(jiǎn)單直接的方法,就是過濾用戶的輸入
可以直接對(duì)用戶的輸入進(jìn)行 HTML escape
<script>window.location.href=”http://www.baidu.com”;</script>
經(jīng)過 escape 之后,就不能執(zhí)行了
<script>window.location.</script>
參考文章推薦
總結(jié) XSS 與 CSRF 兩種跨站攻擊