PHP 预防CSRF、XSS、SQL注入攻击(综合版)

【简约版】

主要通过校验用户输入信息,过滤用户输入信息,以及关闭错误信息显示等方法。

一、SQL注入:将恶意的SQL命令通过表单提交等方式注入到后台数据库引擎进行执行,从而泄露数据库信息

      1.输入验证

      2.错误消息处理

      3.加密处理

      4.使用专业的漏洞扫描工具

二、XSS:跨站脚本攻击,指恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时代,码会被执行,从而达到恶意攻击用户    的目的。

     1.trim()清空空格

     2.strp_tags()过滤html标签

     3.htmlspecialchars() 将字符内容转为html实体

三、CSRF: 跨站请求伪造,它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站

    1.验证http_reffer字段

    2.在请求中添加token并验证

原文:https://blog.csdn.net/qq2942713658/article/details/82494841 

-----------------------------------------------------------------------------------------------------------------------------------------

【精简版】

1.服务端进行CSRF防御


服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
(1).Cookie Hashing(所有表单都包含同一个伪随机值):
这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
(2).验证码
  这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄....这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。
(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)
  在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

2.预防xss攻击


php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义

3.预防sql注入


1、php.ini 中把safe_mode 打开
2、safe_mode_gid = off
3、关闭危险函数 disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
4、关闭PHP版本信息在http头中的泄漏  expose_php = Off
5、打开magic_quotes_gpc来防止SQL注入  magic_quotes_gpc = On 这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换 比如把 ' 转为 \'等,这对防止sql注射有重大作用
6、错误信息控制 error_reporting = E_WARNING & E_ERROR 只显示警告以上
7、错误日志 建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因 log_errors = On
error_log = D:/usr/local/apache2/logs/php_error.log
8、if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
get_magic_quotes_gpc 过滤后不用addslashes 以免重复过滤

<?php     
    function post_check($post)    
    {    
    if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开    
    {    
    $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤    
    }    
    $post = str_replace("_", "\_", $post); // 把 '_'过滤掉    
    $post = str_replace("%", "\%", $post); // 把' % '过滤掉    
    $post = nl2br($post); // 回车转换    
    $post= htmlspecialchars($post); // html标记转换       
    return $post;    
    }    
    ?>


关于SQL注入,不得不说的是现在大多虚拟主机都会把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理

原文:https://blog.csdn.net/only_xiaohang/article/details/80914160 

-----------------------------------------------------------------------------------------------------------------------------------------

 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
       攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
 

        CSRF攻击攻击原理及过程如下:

       1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

       2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

       3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

       4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;


       5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。 

       CSRF攻击实例得意得意得意
       受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。

        黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。

        这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。 

      

       CSRF漏洞检测:
       检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

       随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。

       以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。


        防御CSRF攻击:

       目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。

      (1)验证 HTTP Referer 字段

        根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

        这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。

        然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

       (2)在请求地址中添加 token 并验证

         CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

        这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。

         该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

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

        这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。


        然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

-----------------------------------------------------------------------------------------------------------------------------------------

【详情版】

SQL 注入

什么是 SQL 注入

SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参数的查询字符串里面提交给服务器,从而让服务器执行编写的恶意的 SQL 命令。

对于 web 开发者来说,SQL 注入已然是非常熟悉的,而且 SQL 注入已经生存了 10 多年,目前已经有很成熟的防范方法,所以目前的 web 应用都很少会存在漏洞允许进行 SQL 注入攻击。 除非是入门开发人员,在开发的时候仍使用旧的技术去实现(比如 Java 的 Statement 和 PreparedStatement)

 

SQL 注入漏洞产生的原因

从上面可知,SQL 注入是通过让服务器执行了恶意的 SQL 命令从而进行攻击的,那么主要问题就出在于服务器是如何生成 SQL 语句的。其实绝大多数拥有 SQL 注入漏洞的 Web 系统,在生成 SQL 语句的时候,采用的是拼接字符串的方式,并且没有对要组装成 SQL 语句的参数进行检验和过滤。

 

常见场景

下面就以一个用户登陆的场景来讲解 
现在我们的数据库中有一个用户表(t_user),假设表里面只有两个元素,分别是用户名和密码 
然后在 web 应用中,一般在用户登录时,验证的方法一般都是通过账号和密码去获取数据表中是否存在这样的记录,存在则返回用户,不存在则返回 null; 
那么我们的 SQL 语句大概就会像这样 
SELECT username FROM t_user WHERE username = ‘xxx’ AND password = ‘xxx’

以 Java 为例(使用拼接字符串的形式)

    public User login(User user) {
// 第一步:构造 SQL 语句,在拼接字符串需要添加''
// 这是因为数据库中字符串值要用 '' 包住
        String sql = "SELECT username FROM t_user "
            + "WHERE username = '" + user.getUsername() + "'" 
            + "AND password = '" 
            + user.getPassword() + "'";

// 第二步:执行查询并返回查询的结果
        ...
    }

那么此时我在登陆页面输入以下信息 
账号: 1’ or 1 
密码: xxx(随意) 
那么服务器会生成这样的 SQL 语句 
SELECT username from t_user where username = ‘1’ or 1 and password = ‘xxx’

知道一点关系逻辑的人都知道这样的条件查询总会返回记录,有记录则代表登陆成功,则用户不需要知道正确的账号密码就能登陆系统,如果是登陆前台,那可能还好;可如果他拿到了后台管理的链接,登陆进去了后台,那么你的系统可能就会被恶意破坏了。

从代码中可以看到若是采用这种拼接字符串的形式来生成 SQL 语句,那么这就会给 SQL 注入提供了机会。

 

总结

在开发 web 应用时,应当尽量避免使用拼接字符串的方式来生成 SQL 语句,而且要特别注意检查含有拼接字符串类型的参数的 SQL 语句,尽可能地去测试是否会有 SQL 注入漏洞。

 

XSS 攻击

什么是 XSS

XSS ,全名:cross-site scripting(跨站点脚本),是当前 web 应用中最危险和最普遍的漏洞之一。攻击者尝试注入恶意脚本代码到受信任的网站上执行恶意操作,用户使用浏览器浏览含有恶意脚本页面时,会执行该段恶意脚本,进而影响用户(比如关不完的网站、盗取用户的 cookie 信息从而伪装成用户去操作)等等。 
他与 SQL 注入很类似,同样是通过注入恶意指令来进行攻击。但 SQL 注入是在服务器端上执行的,而 XSS 攻击是在客户端上执行的,这点是他们本质区别。

 

XSS 的种类

XSS 攻击的分类没有标准,但普遍分为三类:

  • 反射型XSS(非持久性跨站攻击)
  • 存储型XSS(持久性跨站攻击
  • DOM Based XSS(基于 dom 的跨站点脚本攻击)

下面将直接以一些小例子来说明以上三种类别的 XSS 攻击分别是怎样的

 

反射型 XSS(非持久性跨站攻击)

一般是利用网站某些页面会直接输出请求参数的特性,通过在 url 的请求参数包含恶意脚本,导致用户打开该 url 的时候,执行恶意脚本。

例:http://localhost:8080/test.jsp?abc= <script>alert(“123”) </script> 
用户在访问这个页面的时候,就会触发弹窗

当然,一般的 XSS 攻击不会这么简单的就让你弹个窗,可能他会让你不断弹窗(对你恶作剧),也可能会盗取你的信息等;而且一般这种形式的 url 会感觉很奇怪,哪有用户会去打开这种奇怪的 url,所以一般会经过一定的包装来欺骗用户。

 

存储型 XSS(持久性跨站攻击)

该种类型的攻击一般是通过表单输入(比如发布文章、回复评论等功能中)插入一些恶意脚本,并且保存到数据库,待其他用户加载对应的页面的时候,该段脚本就会被加载并执行。 
与反射型 XSS 相比,该类的攻击更具有危害性,因为它影响的不只是一个用户,而是大量用户,而且该种类型还可进行蠕虫传播;就如之前的贴吧和微博事件,用户访问了含有恶意脚本的页面,用户的 cookie 信息被盗取了,并且立刻使用用户的账户去发表新的帖子或微博同时注入恶意脚本,使得该恶意脚本不断被传播下去。

 

DOM Based XSS(基于 Dom 的跨站点脚本)

基于 DOM 的跨站点脚本与前面两种类型有什么区别呢?其实它注入的方式是基于前面两种类型的方式的,只不过是注入的脚本是通过改变 DOM 来实施的。采用该种方式有一个好处就是从源代码中不易被发现而已。

 

XSS 攻击漏洞产生的原因

主要原因与 SQL 注入很类似,都是由于开发人员没有对用户输入进行编码和过滤。另一个原因是,这种攻击方法有很多变体,要设计出一个能完全防御的 XSS 过滤器是非常困难的。

 

如何去防护 XSS

基于上面漏洞产生的原因,我们若要想防御该种攻击,就需要从源头抓起(用户输入),制定一套合理且安全的 XSS 过滤规则。 
以下介绍一些过滤方法

  • 对 HTML 标签及一些特殊符号进行转义

    该种方法是一种非常简单的过滤方法,仅仅是通过转义的方式将一些 HTML 标签和属性转义,比如 < 转义成 &lt ;, 这样像<script>xxx</script>的脚本就运行不了。当然简单的过滤方式也就代表很容易就会被绕过。 
    另外如果需要使用含有富文本的功能时,使用这样的过滤就会使富文本失去作用。

  • 使用白名单、黑名单的方式进行过滤

    白名单、黑名单顾名思义是要定义哪些东西是可通过的,哪些东西不可通过。比如常见 <b>、<p>; 、< 等等标签,不可通过的比如 javascript、<a>、<script>、<iframe>、onload 等等一些属性,将其进行转义。 
    当然使用该种方法也有自身的缺点,你并不可能穷举出所有元素,也可能会某些元素在黑名单内,但在某些情况它是需要使用的,这就需要我们在设计 XSS 过滤器的时候权衡好,取最合理最适合需求的设计。

 

总结

身为一名 web 开发人员,应该去了解一下如何能够进行 XSS 攻击,这并不是要你去成为一名黑客去攻击别人的网站,去盗取别人的信息,而是去了解有哪些 XSS 攻击场景,了解产生该漏洞的原因,从而去思考为什么会产生这个 bug,如何去修复这个 bug。要想设计出更好的 XSS 过滤器,就必须得知道有哪些攻击方式,才能这样思考更全面。

注:上面所写的例子,在浏览器中运行不一定能成功,浏览器拥有自身的防御机制,那么简单的攻击方式,一般浏览器自身都已经会拦截了,了,如果你想真的测试的话,自己去 google 一下高级的 XSS 注入方式来学习吧

 

CSRF 攻击

什么是 CSRF

CSRF,全名:Cross site Request Forgery(跨站域请求伪造)。一般的攻击方式是,通过请求伪造盗取用户的 cookie 信息,进而进行操作。

 

CSRF 攻击的原理

假设当前有用户 A,服务器 B,服务器 C(含有恶意脚本)

   

 

Alt text

  1. 首先用户 A 请求登陆了服务器 B,这时服务器 B 响应了用户 A,并且会返回唯一标识的该用户的 cookie 信息。
  2. 用户 A 在未退出服务器 B 时(即仍与服务器 B 保持会话状态),访问了带有恶意脚本的服务器 C,服务器 C 响应给用户 A 一个恶意页面,并且通过恶意脚本伪装用户 A 向服务器 B 发送请求,此时服务器 B 误以为是用户 A 请求,故响应并返回了用户 A 的 cookie 信息。
  3. 服务器 C 收到用户 A 与 服务器 B 的cookie 信息后,保存起来,并利用该信息伪装成用户 A 去访问服务器 B,再进行相应的破坏(想干嘛就干嘛)

 

CSRF 漏洞产生的原因

其主要原因是服务器 B 没有对请求的发起源进行合理的检验,即不加分析地认为请求者一定是正常的用户,就响应了用户信息给非法分子。

 

如何去防御 CSRF

下面提供两种手段,从服务器端来防御 CSRF

  1. 验证 HTTP Referer 的值
  2. 使用请求令牌

 

验证 HTTP Referer

熟悉 HTTP 协议的人都知道,HTTP 的头部 有一个 Referer 信息的字段,它记录着该次HTTP 请求的来源地址(即它从哪里来的)。 
既然 CSRF 攻击伪造的请求是从服务器 C 发送过来的,那么我们就禁止跨域访问,在服务器端增加过滤器的过滤,过滤掉那些不是从本服务器 B 发出的请求,这样可以在一定程度上避免 CSRF 攻击。 
但这也是有缺点的:

  • 禁止别人跨域访问你,那么如果别人通过百度等搜索引擎来搜索你的时候,此时的 Referer 是 百度,服务器将认为这是不被信任的,所以拒绝响应,这样你的 web 应用就很难推广了(这是我自己想的,我还没测试过)
  • 还有一点就是 Referer 的设置问题,虽然一般的浏览器都不允许修改该值,但仍然是存在旧版的浏览器可以修改的(比如 IE6),所以这还是存在一定的安全问题

 

使用请求令牌

该种方式是参考同步令牌所设计的,同步令牌是用于防止表单重复提交的场景。 
请求令牌的工作方式:

  1. 用户 A 访问服务器 B
  2. 服务器 B 以某种随机生成策略生成随机字符串,并作为令牌(token)保存在 session 里面,然后夹带着响应返回给用户,并以隐藏域的形式保存在页面中
  3. 用户每次请求都会夹带着 token 反馈给服务器
  4. 服务器接收到每次请求,都会先进行令牌验证,若令牌验证不通过,则认为该次请求是非法的,拒绝响应。

由于 CSRF 是通过在服务器 C 上伪造请求的方式来访问服务器 B,所以它是获取不了页面中的 token 字符串,所以在一定程度上是能防御的。

 

总结

CSRF 攻击是一种请求伪造的攻击方式,它利用的是服务器不能识别用户的类型从而盗取用户的信息来攻击。因此要防御该种攻击,因为从服务器端着手,增强服务器的识别能力,设计良好的防御机制。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值