概念性的东西就不多说了,大概说一下实践的过程和涉及的相关知识。
网站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:
<?php
echo '<a href="http://localhost/cookie.php">点击</a>';
?>
上面的代码就是会发生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文件的路径。