CSRF攻擊
又叫“跨站請求偽造”,可以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發送惡意請求,CSRF能夠做的事情包括:以你的名義發送郵件,發訊息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉賬......造成的問題包括:個人隱私泄露以及財產安全,
下圖簡單闡述了CSRF攻擊的思想:

1、用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登陸網站A;
2、在用戶資訊通過驗證后,網站A產生Cookie資訊并回傳給瀏覽器,此時用戶登陸網站A成功,可以正常發送請求到網站A;
3、用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
4、網站B接收到用戶請求后,回傳一些攻擊性代碼,并發出一個請求要求訪問第三方站點A;
5、瀏覽器在接收到這些攻擊性代碼后,根據網站B的請求,在用戶不知情的情況下攜帶Cookie資訊,向網站A發出請求,網站A并不知道該請求其實是由B發起的,所以會根據用戶C的Cookie資訊以C的權限處理該請求,導致來自網站B的惡意代碼被執行,
從圖上可以看出,要完成一次CSRF攻擊,受害者必須一次完成兩個步驟:
1、登陸受信任網站A,并在本地生成Cookie,
2、在不退出A的情況下,訪問危險網站B,
示例:
銀行網站A,它以GET請求來完成銀行轉賬的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危險網站B,它里面有一段HTML的代碼如下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&&money=1000>
首先,你登陸了銀行網站A,然后訪問危險網站B,噢,這時你會發現你的銀行賬戶少了1000塊,
為什么會這樣呢?原因是銀行網站A違反了HTTP規范,使用GET請求更新資源,在訪問危險網站B之前,你已經登陸了銀行網站A,而B中的<img>以GET的方式請求第三方資源(這里的第三方就是指銀行網站了,原本這是一個合法的請求,但這里被不法分子利用了),所以你的瀏覽器會帶上你銀行網站A的Cookie發出GET請求,去獲取資源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,結果銀行網站服務器收到請求后,認為這是一個更新資源操作(轉賬操作),所以就立刻進行轉賬操作,
防御方法
1、CSRF攻擊是有條件的,當用戶訪問惡意鏈接時,認證的cookie仍然有效,所以當用戶關閉頁面時要及時清除認證cookie,
2、在客戶端頁面增加偽亂數,在所有POST方法提交的資料中提供一個不可預測的引數,比如一個亂數或者一個根據時間計算的HASH值,并且在cookie中也同樣保存這個引數值(保證兩者值一致),把這個引數嵌入標簽保存在FORM表單中,當瀏覽器提交POST請求到服務器端時,從POST資料中取出這個引數并且和Cookie中的值作比較, 如果兩個值相等則認為請求有效,不相等則拒絕,根據同源策略和Cookie的安全策略,第三方網頁是無法取得Cookie中的引數值的,所以它不能構造出相同隨即引數的POST請求,
<?php
//構造加密的Cookie資訊
$value = "https://www.cnblogs.com/HuiH/p/DefenseSCRF";
setcookie("cookie",$value,time()+3600);
?>
在表單里增加Hash值,已認證這確實是用戶發送的請求,
1 <?
2 $hash = md5($_COOKIE['cookie']);
3 ?>
4 <form method="POST" action="transfer.php">
5 <input type="text" name="toBankId">
6 <input type="text" name="money">
7 <input type="hidden" name="hash" value="https://www.cnblogs.com/HuiH/p/<?=$hash;?>">
8 <input type="submit" name="submit" value="https://www.cnblogs.com/HuiH/p/Submit">
9 </form>
10 //然后在服務器端進行Hash值驗證
11 <?php
12 if(isset($_POST['check'])){
13 $hash=md5($_COOKIE['cookie']);
14 if($_POST['check'] == $hash){
15 doJob();
16 }else{
17 //...
18 }
19 }else{
20 //...
21 }
22 ?>
3、圖片驗證碼
怎么確保資料傳輸程序中的安全性?
1、資料加密
1.1、單向散列演算法:MD5、SHA1
MD5是單向散列演算法,可用來校驗資料的完整性,
功能:
輸入任意長度的資訊,經過處理,輸出為128位的資訊(數字指紋);
不同的輸入得到不同的結果(唯一性);
根據128位的輸出結果不可能反推出輸入資訊(不可逆);
用途:
1)防止被篡改,比如我提供檔案下載,為了防止不法分子在安裝程式中添加木馬,我可以在網站上公布有安裝檔案得到的MD5輸出結果,
2)防止直接看到明文,現在很多網站在資料庫存盤用戶的密碼的時候都是存盤用戶密碼的MD5值,這樣就算不法分子得到資料庫的用戶密碼的MD5值,也無法知道用戶的密碼,
3)防止抵賴(數字簽名),例如A寫了一個檔案,認證機構對此檔案用MD5 演算法產生摘要資訊并做好記錄,這樣可以防止出現以后A不承認此事而帶來的麻煩,
1.2、對稱加密演算法:DES、AES、RC4,
對稱加密,就是加密和解密都使用同一個密鑰,這種方式優點就是速度快,缺點就是在管理和分配密鑰時不安全,
AES:高級加密標準,是下一代的加密演算法標準,速度快,安全級別高,
1.3、非對稱加密演算法:RSA,DSA,
非對成加密有一個密鑰對,叫做公鑰和私鑰,私鑰自己持有,公鑰可以公開的發送給使用人,使用公鑰進行加密的資訊,只有和其配對的私鑰可以解開,非對成加密的優點是安全,因為它不需要把私鑰暴露出去,
那在真正使用的時候,要怎樣進行資料的傳輸?
在正式的使用場景中一般都是對稱加密和非對成加密結合使用,使用非對成加密完成密鑰的傳遞,然后使用對稱加密進行資料加密和解密,HTTP傳輸在建立連接時使用的是非對成加密,一旦連接建立完成,有后續的通訊則使用了對稱加密,這樣做的好處是有利于資料傳輸效率,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27647.html
標籤:其他
上一篇:說下TCP的黏包?
下一篇:快取問題[雪崩、擊穿]
