hi,欢迎访问本站!
当前位置: 首页编程开发正文

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的攻击。

声明:无特别说明,转载请标明本文来源!
相关推荐