防止常见的几种网络攻击的方法

xss 跨站脚本攻击

一、HttpOnly
    防止劫取Cookie

二、输入检查
    输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。

三、输出检查

    1、在HTML标签中输出
  如代码:
      <?php
      $a = "<script>alert(1);</script>";
      $b = "<img src=# onerror=alert(2) />";?>
            <div><?=$b?></div>
            <a href="#"><?=$a?></a>
        这样客户端受到xss攻击,解决方法就是对变量使用htmlEncode,php
        中的函数是htmlentities
    2、在HTML属性中输出
        <div id="div" name ="$var"></div>
        这种情况防御也是使用htmlEncode
        在owasp-php中实现:
        $immune_htmlattr = array(',', '.', '-', '_');
        $this->htmlEntityCodec->encode($this->immune_htmlattr,
        "\"><script>123123;</script><\"");
    3、在<script>标签中输出
        如代码:
        <?php
        $c = "1;alert(3)";
        ?>
        <script type="text/javascript">
            var c = <?=$c?>;
        </script>
    4、在事件中输出
      <a href="#" onclick="funcA('$var')" >test</a>
      可能攻击方法
      <a href="#" onclick="funcA('');alter(/xss/;//')">test</a>
  
    5、在css中输出
        在owasp-php中实现:
        $immune = array("");
        $this->cssCodec->encode($immune,
        'background:expression(window.x?0:(alert(/XSS/),window.x=1))
        ;');

    6、在地址中输出
        先确保变量是否是"http"开头,然后再使用js的encodeURI或encodeU
        RIComponent方法。
        在owasp-php中实现:
        $instance = ESAPI::getEncoder();
        $instance->encodeForURL(‘url’);
四、处理富文体
    就像我写这篇博客,我几乎可以随意输入任意字符,插入图片,插入代
    码,还可以设置样式。这个时要做的就是设置好白名单,严格控制标签
    。能自定义 css件麻烦事,因此最好使用成熟的开源框架来检查。php可
    以使用htmlpurify

五、防御DOM Based XSS
    DOM Based XSS是从javascript中输出数据到HTML页面里。
    <script>
        var x = "$var";
        document.write("<a href='"+x+"'>test</a>");
    </script>

    按照三中输出检查用到的防御方法,在x赋值时进行编码,但是当documen
    t.write输出数据到HTML时,浏览器重新渲染了页面,会将x进行解码,
    因此这么一来,相当于没有编码,而产生xss。

    防御方法:首先,还是应该做输出防御编码的,但后面如果是输出到事
    件或脚本,则要再做一次javascriptEncode编码,如果是输出到HTML内
    容或属性,则要做一次HTMLEncode。

    会触发DOM Based XSS的地方有很多:

    document.write()、document.writeln()、xxx.innerHTML=、xxx.outerH
    TML=、innerHTML.replace、document.attachEvent()、window.attachEv
    ent()、document.location.replace()、document.location.assign()

csrf 跨站请求伪造

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

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

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

sql 注入

1)检查变量数据类型和格式

1、使用正则表达式过滤传入的参数

2、PHP函数检查变量

3、前端js检查是否包函非法字符

不灵活,要写死多个检测方法

2)过滤特殊符号

对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP
为例,通常是采用addslashes函数,它会在指定的预定义字符前添加反斜杠
转义,这些预定义的字符是:单引号(') 双 引号 (") 反斜杠 (\) NULL。

相对安全,只是增加黑客的难度,还是能破解

3、绑定变量,使用预编译语句

     MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分
     别有使用预编译语句的方法。实际上,绑定变量使用预编译语句是预防
     SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL
     语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的
     结构,像上面例子中,username变量传递的plhwin' AND 1=1--
     hack参数,也只会当作username字符串来解释查询,从根本上杜绝了SQ
     L注入攻击的发生。

Ddos 攻击 流量攻击

1、随机抛弃一部分请求
2、提高服务器配置
3、高防IP ->aliyun
4、idc 机房 ->运营商

猜你喜欢

转载自blog.csdn.net/weixin_41782053/article/details/80411975