csrf攻击原理和防御
Posted 编程杂技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csrf攻击原理和防御相关的知识,希望对你有一定的参考价值。
1 攻击
概念性的东西就不多说了,大概说一下实践的过程和涉及的相关知识。
网站A:
<?php
if(!isset($_COOKIE['username'])){
if(isset($_GET["login"]))
{
setcookie("username","cyb");//,time()+3600*24
echo "登录成功~";
}
else
echo '登录失败~';
}
else{
echo '登录成功~';
}
?>
上面的代码意思大概是,如果有username的存在,那么说明用户已经登录成功,否则通过判断url中是否有login参数,如果有就进行登录,并写cookie。该代码路径是在localhost/cookie.php。
网站B:
点击cookie.php上面的代码就是会发生csrf的网页代码,代码路径是在www.cyb.com/csrf.php。
下面讲一下过程,当用户登录网站A成功后,每次请求都会带上cookie的信息,如果这时候用户同时在同一个浏览器中打开网站B,而此时,网站B中含有一个链接,如果用户点击的话就会发生csrf攻击,因为用户点击这个url的时候,浏览器会带上cookie信息,所以用户的url所带的操作是不会被阻止的,而坏人可以构造各种url来发生各种攻击,这里的重点是用户登录后的cookie信息,因为没有这些信息,坏人是无法通过服务器的验证的。下面说说cookie的问题。
我们看到以上的代码中设置cookie的时候是不设置过期时间的,这时候默认会是会话cookie,也就是说如果用户登录了网站A,关闭了浏览器,再打开网站B,是不会发生攻击的,因为这时候cookie已经失效,会话cookie意思就是浏览器关闭后就会销毁cookie的信息,但是这里有一个问题,就是不设置cookie的时间时,默认情况下并不总是会话cookie,这是服务器设置的,在php.ini中看到session.cookie_lifetime = 0这一行,这一行意思是如果不设置cookie时间,则默认为浏览器关闭就销毁cookie,我们可以修改这个值来修改cookie的行为,我测试的时候修改为100,然后返回的setcookie中会出现这样的信息username=cyb; expires=Mon, 25-Apr-2016 10:42:54 GMT; Max-Age=86400,也就是说cookie的过期时间不再是关闭浏览器后销毁了,如果修改这个默认的行为,意味着就算浏览器退出后再打开,也是会发生csrf攻击的,因为cookie还没失效。
最后提一下php.ini这个文件的问题,在wamp下有两个这样的文件,一个在apache下,一个在php下,在apache下的是apache会加载的文件,所以我们需要修改这个文件,这样我们访问服务器的时候才能生效,而php下的文件是php以命令行下执行时会使用的文件,我们可以在windows的cmd下,cd到php.exe的路径下,然后执行php -ini里面的信息显示了php使用的ini文件的路径。
2 防御
除了在每个表单页面里加入hidden input外,还有一种利用csrfcode进行防御的方法,这种方法把csrfcode的相关数据放在cookie中,但并不是把csrfcode放到cookie中,比如我们在cookie中放入a=123,b=456,然后请求的时候,如果需要加入csrfcode时把a+b当做csrfcode,也就是579作为csrfcode放到请求中,然后发到后端,后端本身会保存着a和b的值,并且和前端有着一样的计算方法,后端根据这个用户的session取出对应的a和b的值,然后相加,看是否和前端传过来的值相等,这样就可以进行csrf攻击防御。
例子:比如某个网站x有形如http://a.b.c/delete?id=1这样删除文章的url,如果在另一个恶意者网站上挂着这么一条url,用户点击的时候,就会把用户的某个数据给删除了,而如果利用了刚才的方法,那么正常来说,用户点击删除按钮的时候,在发起请求之前,x网站的会先计算csrfcode然后加到请求的url中,再发起这个请求的,这时候恶意者网站就无法做到这一点。虽然他可以知道csrfcode的计算方法(这个可以通过查看网站x的源码可以知道),但是他无法知道或者说得到用户的cookie,所以他无法得到cookie中的两个键a和b。这样就可以起到防御作用。
以上是关于csrf攻击原理和防御的主要内容,如果未能解决你的问题,请参考以下文章