CSRF是Cross Site Request Forgery的縮寫,乍一看和XSS差很少的樣子,可是其原理正好相反,XSS是利用合法用戶獲取其信息,而CSRF是僞形成合法用戶發起請求。javascript
客戶端以post方式請求數據,發起合法請求。(在第一次get請求的時候發送客戶端一個證書或身份,下次再請求的時候會驗證身份)php
在XSS危害——session劫持中 咱們提到了session原理,用戶登陸後會把登陸信息存放在服務器,客戶端有一個用戶標識存在cookie中,只要用戶不關閉瀏覽器或者退出登陸,在其 有效期內服務器就會把這個瀏覽器發送的請求看成當前客戶,若是這時候用戶被欺騙,使用瀏覽器打開了某些惡意網址,裏面就會包含一些不是用戶但願發送的請 求,服務器也會把這些請求看成是當前客戶發送的請求,這時候用戶的我的信息、資金安全、若是用戶權限高整個站點均可能會受到危害。html
CSRF原理很簡單,當用戶登陸以站點時用瀏覽器打開一惡意網址,就有可能遭受攻擊。有同窗會奇怪了這個很難實現吧,必須同時知足兩個條件才行。其 實很簡單,好比咱們使用QQ,看看QQ zone,忽然蹦出個包含中獎或者問卷調查連接的聊天窗口(或者是。。。),這個騰訊作了防範,可是咱們收到封郵件包含此內容,不少用戶會選擇去點擊java
在網上找了張圖片很能說明這個過程跨域
簡單小例子瀏覽器
在某個論壇管理頁面,管理員能夠在list.php頁面執行刪除帖子操做,根據URL判斷刪除帖子的id,像這樣的一個URL安全
http://localhost/list.php?action=delete&id=12
當惡意用戶想管理員發送包含CSFR的郵件,騙取管理員訪問http://test.com/csrf.php,在這個惡意網頁中只要包含這樣的html語句就能夠利用讓管理員在不知情的狀況下刪除帖子了服務器
<img alt="" arc="http://localhost/list.php?action=delete&id=12"/>
這個利用了img的src能夠跨域請求的特色,這種狀況比較少,由於通常網站不會利用get請求修改資源信息cookie
升級session
是否是網站利用post修改信息就安全了呢,還拿剛纔例子,改爲post修改的
<?php $action=$_POST['action']; $id=$_POST['id']; delete($action,$id); ?>
可是惡意網站這麼寫同樣能夠攻擊
<!DOCTYPE html>
<html>
<body>
<iframe display="none">
<form method="post" action="http://localhost/list.php">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="12">
<input id="csfr" type="submit"/>
</form>
</iframe>
<script type="text/javascript"> document.getElementById('csfr').submit(); </script>
</body>
</html>
1. 使用post,不使用get修改信息
2. 驗證碼,全部表單的提交須要驗證碼,可是貌似用起來很麻煩,因此一些關鍵的操做能夠
3. 在表單中預先植入一些加密信息,驗證請求是此表單發送