vlambda博客
学习文章列表

[基础] PHP网站如何防止CSRF(跨站请求伪造)

PHP自学中心
PHP自学中心分享PHP学习经验,PHP技巧,PHP实例,PHP笔记,PHP视频教程,PHP笔试题等。一篇技术文章就是一个知识点,提升技术技能全靠自己的学习习惯。跟着一起学习,每天进步一点点,让阅读与学习成为你的一种习惯吧!
308篇原创内容
Official Account

每天给你分享一个PHP基础知识点,希望能帮助到你,花5分钟时间看看。或许你早就知道如何用,或许对你有些许帮助,可是最后还是感谢你的关注




什么是CSRF

攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。


如:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。


防御CSRF攻击:


1)验证 HTTP Referer 字段


在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。



而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。


因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。


如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

 if(eregi("www.bank.com"$_SERVER['HTTP_REFERER'])) { 
           echo "验证通过,允许后面的操作";
 } else { 
      echo "非法请求!"
}      


但是这个这个检测会轻易的忽略掉来自某个攻击者伪造的HTTP Referer欺骗,攻击者可以使用如下代码:

header("Referer: www.mano100.cn");    

或者其他在恶意脚本中伪造HTTP头并发送的方法。



CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。


要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。


可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。


比如 TP5项目中 可以使用token来验证。每次提交表单后,token变化.



3)在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。


通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。




文章来自:https://blog.csdn.net/resilient/article/details/109737306

以上是本文的全部内容,希望对大家的学习有帮助,也希望你多多支持php自学中心