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