您的位置:首页 > 其它

CSRF攻击方式及解决方法

2017-12-04 22:00 190 查看
场景一:网站表单数据提交没有任何验证,直接把表单数据插入数据库。

攻击:根据提交地址直接循环访问该地址,插入数据

<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项

查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: