2011-03-22 72 views
1

這是否可以防範SQL注入攻擊?這是否可以防止注入攻擊?

function sanitize($value) { 
    // Stripslashes 
    if (is_array($value)) { 
     if (get_magic_quotes_gpc()) { 
      $value = array_map("stripslashes", $value); 
     } 
     $value = array_map("mysql_real_escape_string", $value); 
    } else { 
     if (get_magic_quotes_gpc()) { 
      $value = stripslashes($value); 
     } 
     $value = mysql_real_escape_string($value); 
    } 
    return $value; 
} 

$_REQUEST = array_map('sanitize', $_REQUEST); 
$_GET = array_map('sanitize', $_GET); 
$_POST = array_map('sanitize', $_POST); 
$_COOKIE = array_map('sanitize', $_COOKIE); 

我可以在sanitize()中添加什麼以防止跨站點腳本? 還有哪些渠道可以讓攻擊者插入惡意代碼?

+0

與Xss我不會擔心存儲數據。在輸出數據時使用htmlspecialchars來防止XSS。 – Belinda 2011-03-22 17:15:47

+1

查看關於此事的其他一些主題。這一個很不錯:http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php – Bjoern 2011-03-22 17:15:50

+0

這取決於你如何使用這些數據。 – Gumbo 2011-03-22 17:24:24

回答

2

一個單詞的答案是「是」。但是:

  1. 如果$value是包含其他數組的數組,則它將無法正確處理。您應該循環使用$value爲您找到的每個陣列遞歸調用sanitize
  2. 最好使用準備好的語句而不是這樣做。當然,如果你已經有一個完整的應用程序,而不是從頭開始構建,這可能會有問題。

最後,其中有人能顛覆你的應用程序中的其它方式跨站點腳本(又名CSS或者XSS)和跨站點請求僞造(CSRF)。在這裏有很多資源,並且可以在互聯網上使用,以加快速度。作爲起點,對XSS的保護包括對輸出的任何內容調用htmlspecialchars,同時針對CSRF的保護涉及要求特權用戶可以在您的站點上執行的每項操作的特定於會話的代碼。

陣列安全sanitize版本

function sanitize($value) { 
    if (is_array($value)) { 
     foreach($value as &$item) { 
      $item = sanitize($item); 
     } 
    } else { 
     if (get_magic_quotes_gpc()) { 
      $value = stripslashes($value); 
     } 
     $value = mysql_real_escape_string($value); 
    } 
    return $value; 
} 

更新:

對於較高的知名度:比約恩的鏈接到這個問題(What's the best method for sanitizing user input with PHP?)纔是真的好。

+0

我應該添加什麼來防止跨站點腳本?一些可以去除所有html/javascript的東西 - 是strip_tags()然後htmlspecialchars()是一個不錯的選擇? – 2011-03-22 17:20:16

+1

@ A-OK:'htmlspecialchars'既好又足。我不會相信'strip_tags'的保護措施,因爲可能會將錯誤的HTML提供給您,目的是混淆它。如果你願意,你可以使用'strip_tags'進行化妝品改進**,然後再使用'htmlspecialchars' **來獲得真正的安全性。 – Jon 2011-03-22 17:23:02

+0

謝謝。有沒有在sanitize()中調用htmlspecialchars()來防範XSS的一點?如果惡意代碼必須通過$ _REQUEST發送,$ _POST,$ _GET或$ _COOKIE不會有效剝離任何HTML/JS內容? – 2011-03-22 17:29:47

0

您應該添加html_entities。大多數時候,你把$ _ POST變量到一個文本框,如:

<textarea><?php echo $_POST['field']; ?></textarea> 

他們可以搞砸你的HTML通過填寫並做他們想做的任何事情。

+0

現在他們可以填寫如下內容: 並搞砸你的HTML。 – 2011-03-22 17:15:42

1

如果在之後應用建立了數據庫連接,則它會正確地轉義初始輸入數據。

但是,現在您在使用這種轉義的HTML輸出值時會遇到問題。它不能防止二次SQL注入(查詢數據庫,然後將這些值用於第二個查詢)。而更重要的是,大多數應用程序都在輸入值上工作。如果你做任何重寫或字符串匹配,你可能會撤消一些轉義。

因此,通常建議在組裝查詢之前應用轉義權。儘管如此,代碼本身適用於一般情況,如果您不能重寫遺留代碼的堆棧,這是明智的。

2

使用PHP Data Objects或...使用Database Abstraction Layer或者...一些框架,做到這一點。

不要寫你自己的原因:

  • 別人已經
  • 他們的代碼工作正常
  • 您可以使用自己的代碼,免費
  • 他們認爲所有你所不懂的問題還不知道。
  • 這樣做很多工作,它已經完成了,花了二十分鐘,找出別人的代碼來做這件事。
+0

謝謝,但這需要更多的工作,因爲我沒有從頭開始做任何事情。另外,學習很有趣。 – 2011-03-22 17:24:26

+0

如何使用已編寫的代碼比自己編寫代碼需要更多時間? – Incognito 2011-03-22 17:26:49

+0

那麼這取決於需要花多少時間來了解它並在現有網站上使用它。我的託管服務器是否支持PDO?在phpinfo()中沒有提及它。 – 2011-03-22 17:36:52

相關問題