2010-06-09 54 views
3

我用這個:功能淨化輸入值PHP

function safeClean($n) 
{ 
    $n = trim($n); 

    if(get_magic_quotes_gpc()) 
    { 
     $n = stripslashes($n); 
    } 

    $n = mysql_escape_string($n); 
    $n = htmlentities($n); 

    return $n; 
} 

爲了防止任何類型的MySQL注入或類似的東西的。每當我用它環繞$ _POST像這樣:

$username = safeClean($_POST['user']); 
$password = md5(safeClean($_POST['password'])); 
$vpassword = md5(safeClean($_POST['verify'])); 
$email = safeClean($_POST['email']); 

,它甚至沒有工作,但我重視的functions.php和目錄是正確的,但在所有的,因爲它只是顯示了一個不工作空白頁...如果我從每個$ _POST中刪除safeClean(),它就會起作用。

這是怎麼回事?

+2

沒有通用函數來做這件事(除了'function foo($ str){return'';}')。每種語言和上下文都有自己需要照顧的特殊字符。 – Gumbo 2010-06-09 19:07:06

+1

您不必在密碼上使用safeClean()。 MD5已被消毒:) – 2010-06-09 19:07:38

+0

你想輸出什麼?什麼不工作? – thetaiko 2010-06-09 19:08:30

回答

4

嘗試使用mysql_real_escape_string()而非mysql_escape_string()

7

在我看來,這種一般消毒方法是不去想事情的最好方法。首先,參數化查詢(使用PDO最爲方便)是解決SQL安全問題的更好方法。但一般 ...

我知道開發人員的衝動是試圖減少你必須考慮的事情的數量。所以,當然,你想看看你是否可以想出一個多用途的消毒功能,你可以把所有的輸入交給,而不必再擔心。然而,輸入是一個舞臺,如果你真的需要安全性,你需要專門思考每個輸入數據應該是什麼以及它最終會發生什麼。如果你在這裏繼續自動駕駛,將會在某個時間點引入安全問題

2

幾乎所有代碼都是錯誤的。

get_magic_quotes_gpc是錯誤的,ヶ輛是錯誤的,甚至術語「消毒」被濫用。

由於事實上,你不應該清理數據庫什麼。但只要遵循語法規則。
看一看的非常類似的問題,我已經解釋了SQL事務相當不錯:In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?

而且爲空白頁面,你要學會調試的底漆。您必須打開錯誤報告以查看錯誤消息而不是空白頁。要開始使用它,你可以參考這篇文章: 鏈接開始:http://www.ibm.com/developerworks/library/os-debug/

你可以從你的CRIPT

ini_set('display_errors',1); 
error_reporting(E_ALL); 

的頂部,此代碼查詢執行添加這些行開始:

$result = mysql_query($query); 
if (!$result) trigger_error(mysql_error());