2013-10-28 57 views
3

我知道使用MySQLi和PDO的好處,但我想知道如何清理多項選擇列表的最佳方式不在以下選項中:消毒多項選擇列表的最佳方式

首先顯而易見的方法使用mysql_real_escape_string:

$clean_POST = array(); 
$clean_POST = mysql_real_escape_string($_POST['foo']); 

但有一個風險,即惡意用戶可以通過衆多的POST值發送和管理堵服務器?回覆here似乎表明這是一種可能性。

此問題可以通過創建白名單並遍歷它檢查在POST精確匹配來緩解:

$_POST['foo'] = array('a', 'b'); 
$whitelist = array(‘a’, 'b', 'c', 'd'); 
$clean_POST = array(); 

if (isset($_POST['foo'])) 
    { 
    foreach ($whitelist as $value) 
     { 
     if (in_array($value, $_POST['foo'])) 
      { 
      $clean_POST[] = $value; 
      } 
     } 
    } 

但相對於MySQL的實時的轉義字符串的方法是有可能是使用這種方法的顯着的處理時間缺點,特別是在需要同時處理大量字段的情況下?

考慮到安全性和性能,是否可以將一種方法視爲優越?

回答

2

在許多編程環境中,性能與安全性不合適。很可能您的輸入檢查會導致數據庫更新或插入查詢,這將比您的「複雜」輸入檢查花費的時間長100到1000s。

請考慮在1(2,5,20)年的時間裏,您或其他人會在您的代碼上工作,不知道爲什麼或者如果做了什麼。最佳做法是檢查一組允許的條目,否則你將不會有下拉列表。另外,在下拉列表的顯示和表單提交之間,這個值列表可能已經改變,因此您需要再次檢查它。

所有主要的框架都以這種方式檢查,所以遲早你會得出同樣的結論。

+0

很好的答案。消毒後的確有一些相對較重的查詢,所以聽起來相對來說,後者不太可能導致顯着的性能下降。這就是說我可能會嘗試一些基準來滿足我的好奇心。 – user2468499

1

通常的建議是:只在需要的地方進行消毒,僅在需要的地方進行消毒,僅在需要的地方使用。即:您的所有POST是否會成爲某個查詢的一部分?如果沒有,那麼你只需要清理那些將在查詢中使用的部分。

現在,關於你認爲的缺點 - 當然,它會是,你應該採取措施。檢查白名單的情況比使用轉義功能的情況要快很多。在你的具體情況下,解決這個問題的最好方法就是測量。一般而言,白名單是保護您的字段的最有效的工具 - 因爲您可以肯定沒有任何東西可以克服它們,並且可以進一步傳遞給您的應用程序。所以,我建議 - 如果您確切知道有限的一組允許值 - 請將該設置用作白名單。

+0

感謝您的指點,做一些基準檢查相對性能不是一個壞主意。 – user2468499

相關問題