什么是 CSRF攻击?服务器如何防止CSRF攻击

发布时间:2017-08-23 13:39:50
什么是 CSRF攻击?服务器防止CSRF攻击
什么是 CSRF?
CSRF - Cross-site Request Forgery 字面意思是指跨站点恳求伪造,一般用来指 WEB 网站的这一类缝隙,即在某个歹意站点的页面上,促进拜访者恳求你的网站的某个 URL(一般会用 POST 数据办法),然后到达改动服务器端数据的意图。这一类攻击依赖于你的网页中的表单,软弱的表单很容易受到攻击。关于你网站中的拜访者而言,可能会受到以下攻击:
* 在你的网站以外记载受攻击者的日志(比方:Slashdot);
* 修正受攻击者在你的网站的设置(比方:Google);
* 修正你的硬件防火墙;
* 运用受攻击者的登录信息在你的网站中宣布评论或留言;
* 经过受攻击者的 IP 地址宣布匿名留言;
* 将资金转移到另一个用户帐号中。
什么是 CSRF攻击?服务器防止csrf攻击
CSRF 攻击的典型是那些运用 cookie 记载登录信息的网站,但关于一些允许某个 IP 地址拜访的页面(如内部网),这一类攻击也会见效。
CSRF 攻击一般会运用到 JavaScript(但不仅限于 JavaScript)完成跨站点自动提交表单--表单数据能够躲藏,提交按钮能够伪装成连接或滚动条。 
服务器防止CSRF攻击
* 断定那些承受可改动服务器数据的 CGI 只承受 POST 参数,不承受 GET 参数,一些服务器端言语默许一起承受两种办法提交过来的参数;
* 断定表单提交处置的是你自个的表单,能够运用一个躲藏字段中寄存 MD5 字
符串,此字符串是将登录 cookie 数据与服务器端寄存的密钥进行 MD5 以后的
结果,只要这个 MD5 字符串准确时才承受表单数据;
* 另外还能够添加一个更为严厉的办法:在表单中添加一个时间戳的躲藏字段,
并将其包含到 hash 字符串中,如果时间戳超越某个时间,则以为表单已过期。
当表单过期时,给出一个办法能够让用户从头提交表单,比方将用户之前填写的数据照旧放入表单中,但运用一个新的 hash 字符串。
一个 PHP 的表单比如,表单代码:
$key = y8s4Z7m2; //MD5 加密密钥
$time = time(); //当时时间
$hash = md5($time.$key); //hash 字符串
?>
Comment:
cols="60">
表单提交以后的 comment.php 后台处置程序代码:
$key = y8s4Z7m2; //密钥,与上面的共同
$expire = 1800; //表单过期时间:半小时
$my_hash = md5($_POST[time].$key); //准确的 hash 字符串
if ($my_hash != $_POST[hash]) //hash 字符串不准确
 die(非法表单提交。);
if (time() - $_POST[time] > $expire) {
 //表单现已过期,生成新的时间戳和 hash 字符串,显现表单让用户从头提交
。(此处省掉)
 //….
}
//表单验证经过,能够承受表单提交的数据,并进行其它操作。
//….
?>
不要以为能够经过Referer头信息来维护你的网站用户,使其不受CSRF攻击。