场景一:网站表单数据提交没有任何验证,直接把表单数据插入数据库。
攻击:根据提交地址直接循环访问该地址,插入数据
<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项