2013-07-31 149 views
0

首先,我根本不確定,但大多數SQL注入,XSS攻擊等都是通過URL使用GET參數發生的。URL檢查函數返回false? PHP

所以我想知道,如果我可以清理它們並檢測是否存在非法字詞,如果是,退出404頁面。

所以這是我的函數:

private static function cleanPath() 
    { 
     if (isset($_GET)) 
     { 
      $count  = 0; 
      $illegal = array 
      (
       '<?', '<?php', '?>', '(', ')', 
       '{', '}', 'SELECT', '*', 'FROM', 
       'WHERE', 'select', 'from', 'where', 
       'DELETE', 'delete', 'echo', 'print', 
       'html', 'div', 'class', 'function', 
       'prepare', 'query', 'execute', 'exec_', 
       '_', '++', 'bindvalue', 'static', 
       '$' 
      ); 

      foreach ($illegal as $i) 
      { 
       foreach ($_GET as $key => $value) 
       { 
        $check = strpos($key, $i); 
        if (!$check) 
        { 
         $count++; 
        } 
       } 
      } 

      if ((int)$count == count($illegal)) 
      { 
       return true; 
      } 
      else 
      { 
       echo $count . ' array count:' . count($illegal) . '<br />'; 
       return false; 
      } 
     } 
    } 

但似乎功能不能正常工作。

我進入這個鏈接:?section=register&sec

它會返回false。

當我進入這個鏈接:?section=register&section

它將返回true,如果我輸入任何東西,除了部分,它會返回false。 它爲什麼這樣做?

,你看,我已經調試這一點,這就是它返回:

62 array count:31 

所以$count = 62 and array count = 31

爲什麼它去62?看起來它是櫃檯翻一番。 我做錯了什麼?

+3

你不會過濾每一個不好的單詞,任何嘗試這樣做都是徒勞的,爲什麼不把白名單好詞彙 – Anigel

+1

這個問題已經解決了。使用[PDO](http://www.php.net/manual/en/class.pdo.php)確實更容易。 – Blazemonger

+0

你可以這樣做,或者只是使用PHP/PDO和htmlspecialchars()來防止XSS –

回答

3

你的邏輯去,如果一切正常,實際的比較來檢查,這將是:

if ((int)$count == (count($_GET) * count($illegal))) 

因爲計數器被遞增,每學期非法每GET參數。

話雖如此,您用於這個問題的方法幾乎不可能達到甚至廣泛,更不用說完成了。

最好是對輸入進行清理並使用編程結構來防止非法值被處理(如Anigel提到的,將您想要的內容列入白名單),而不是尋找什麼是錯誤的構造。