php中csrf的攻击与防御介绍
墨初 编程开发 547阅读
在网络中,安全是一个很重要的问题。其中,跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击是一个很常见攻击方式,也是很容易被攻击者利用的漏洞。那么,下面的博文73so博客将介绍一下CSRF攻击和防御方案。
CSRF攻击是什么
CSRF攻击,即跨站请求伪造,是一种利用受害者已登录的状态,在受害者毫不知情的情况下,向目标网站发送恶意请求的攻击方式。攻击者可能通过各种方式获取到受害者的登录态,然后在不被察觉的情况下,向目标网站发起伪造的请求,从而实施攻击。攻击者可能通过让受害者访问第三方网站、通过邮件或聊天软件中的链接、在社交网络上发布链接等方式,诱导受害者进行操作,从而触发攻击。
如下的示例,是一个恶意的提交方式:
<form action="https://www.xxxx.com/comment" method="post"> <input type="hidden" name="comment" value="harmful comment" /> <input type="submit" value="Submit Comment" /> </form>
以上的表单提交,是向一个指定的网址发送一个请求,这种的提交方式是非常的隐蔽的。如果网站未防范csrf,会导致攻击成功。
如何进行crsf防疫
下面提供几种关于预防csrf攻击的方法,可以根据自身的情况进行使用。
1、加入token认证
在用户访问或登陆网站时,服务器生成一个token临时保存在服务器并传给用户的浏览器。后期用户再次访问网址时,请求中加入token值,并与服务器端保存的token进行对比。
注:生成的token必须弄个有效期,一般以1小时为期限,token到期后更换新的token值。
示例:
php后端生成token:
session_start(); if(!isset($_SESSION['token'])){ $_SESSION['token'] = md5(uniqid(rand(), true)); } $token = $_SESSION['token'];
前端提交时加入token:
<form method="post" action="/some/url"> <input type='hidden' name='token' value='<php echo $token;?>' /> <input type="text" name="username" /> <input type="text" name="password" /> <input type="submit" value="Submit" /> </form>
2、加入Referer验证
Referer是HTTP头的一部分,它包含了用户是从哪个页面转向当前页面的。通过检查HTTP头中的Referer,服务器可以判断该请求是否来自一个合法的页面。如果检测到Referer不正确,服务器将拒绝响应该请求。
例:
$referer = $_SERVER['HTTP_REFERER']; if(parse_url($referer, PHP_URL_HOST) != 'www.73so.com') { die("Invalid Referer"); }
3、使用cookie验证
在一些重要的网页中可以设置指定的cookie,用户访问页面时可以检测指定的cookie是否存在,如果不存在刚禁止网页被访问。
header('Set-Cookie: csrf_cookie=' . uniqid(rand(), true) . '; path=/; HttpOnly');
上面的代码中,在生成csrf_cookie时将其设置为HttpOnly,这意味着cookie只能通过HTTP协议传输,并不能通过JavaScript访问。
总结:
CSRF是一种很霸道且很隐蔽的攻击方式。防御CSRF攻击不仅有助于保护数据安全,而且也是实现安全编程的一个基本要求。在php开发中我们可以通过设置token验证、Referer验证以及浏览器cookie等方式来防御csrf的攻击。