1. 程式人生 > >防止常見的幾種網路攻擊的方法

防止常見的幾種網路攻擊的方法

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 機房 ->運營商