CSRF攻擊方式及解決方法

場景一:網站表單數據提交沒有任何驗證,直接把表單數據插入數據庫。
攻擊:根據提交地址直接循環訪問該地址,插入數據

<form action="http://xxx.com/laravel54/public/msg" method="post">
        <p><input name="uname" type="text" value=""></p>
        <p><textarea name="content"></textarea></p>
        <p><input type="submit" value="提交"></p>
</form>

場景二:網站表單數據提交開啓了session驗證,表單數據插入數據庫。
攻擊:通過廣告或鏈接,獲取用戶當前瀏覽器cookie,僞造header頭,訪問目標網站

<?php
//1.初始化(curl_http)
$ch = curl_init(); 

//2.配置
    //2.1設置請求地址
    curl_setopt($ch, CURLOPT_URL, 'https://www.XXX.com/article/ajaxedit');
    //2.2設置響應的數據流賦給變量而不是直接輸出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //2.3設置post請求
    $postData = [];
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    //2.4僞造header頭
    $header = array('Cookie:xxxxxxxxx');  
    curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
    //2.5https請求 不驗證證書和hosts
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//3.發送請求
$data = curl_exec($ch);
echo $data;die;
//4.關閉請求
curl_close($ch);
?>

解決方式

步驟1:頁面所有表單提交時候生成一個隨機字符串保存在session中,並且在表單中隱藏該隨機字符串。
步驟2:處理表單程序進行驗證(判斷表單提交的隱藏的數據是否和session中的一致)

Laravel中避免CSRF攻擊

1 開啓csrf攻擊:修改app\Http\Kernel.php中的\App\Http\Middleware\VerifyCsrfToken::class
2 在頁面增加csrf隱藏域避免站內失效
<input type="hidden" name="_token" value="{{ csrf_token() }}">
注意:若表單數據要插入數據庫,別忘去掉接收數據中的_token項

查看

發佈了31 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章