2012-11-28 26 views
2

可能重複:
Does mysql_real_escape_string() FULLY protect against SQL injection?結合用strip_tags和PHP mysql_real_escape_string表單提交時

在我的網頁我創建了一個表格,什麼我想要做的是張貼在字段值時php編碼我想同時使用strip_tagsmysql_real_escap_string作爲:

$res = stript_tags(mysql_real_escape_string($_POST['name'])); 

上述編碼是否正確提供輸入字段名稱的安全提交,否則在提交時會產生任何問題。

+1

沒有問題會發生,你可以使用它.... :) –

+3

你可能不想使用'strip_tags()',至於'mysql_real_escape_string()',[**請參閱這裏獲取更多信息* *](http://stackoverflow.com/questions/1220182/does-mysql-real-escape-string-fully-protect-against-sql-injection) – phant0m

回答

2

這本身應該工作得很好。但個人而言,我建議你而不是完全可以使用mysql_real_escape_string。我相信我認爲你正在使用mysql_*擴展名是正確的,該擴展名已被棄用。幫你一個忙,並切換到PDOmysqli_*,最好是PDO。

這些是更現代的擴展,支持編寫的說明
see my answer here爲幾個鏈接。此外,請參閱Bobby tables,瞭解爲什麼準備好的語句比手動轉義數據更安全。

正如@ phant0m所說:使用mysql_real_escape_string並非完全證明(請參閱他的評論中的鏈接)。還有一對夫婦的陷阱使用像strip_tags和功能尤其是stripslashes時:當你在處理數據時,它不是不可想象的是,在某些時候,該數據包含有類似Foo\'s Bar,並且,作爲文檔說:

如果magic_quotes_sybase處於打開狀態,則不會剝去反斜槓,但會將兩個撇號替換爲一個反斜槓。

嘗試搞清楚stripslashes(mysql_real_escape_string($data));的結果會是什麼?

當使用strip_tags,一定要注意的是,允許標籤保持自己的屬性,其中可能包含的斜槓,冒號很重要,分號,破折號,引號和其他各種字符,你不希望看到弄亂你的查詢...
對於strip_tags更多可能的問題,看看at this post

+0

我要去PDO。任何站點爲開發人員提供完整的PDO參考。非常感謝您的有用答案 – Rithu

+1

您可能想要添加一條關於OP使用'strip_tags()'來完全回答問題的語句。 – phant0m

1

您發佈的代碼將起作用。不過,最好在最新時刻處跳過字符串。這將保持你的變量乾淨,因爲你不想在實際查詢之前使用轉義字符串。

一個例子:

$query = "SELECT * FROM tablename WHERE column1 = '". mysql_real_escape_string($_POST['name']) ."'"; 

還要注意的是mysql_ *函數不再保持 - 你可以使用mysqli_*代替,但最好的方法是使用準備好的語句與PDO

+0

'mysql_ *'不被棄用,只是不再維護 - 他們將在下一個主要版本中被棄用(希望)。另外:我建議使用PDO而不是'mysqli_ *',因爲'mysqli_ *'仍然允許舊式程序編碼(這是我們試圖擺脫的),而'PDO'提供了一組驅動程序,對於DB的_other_比MySQL ...因此它更具前瞻性 –

+0

非常感謝回答 – Rithu

+0

@EliasVanOotegem感謝您的輸入!我相應地編輯了答案。 – weltschmerz

1

Y你應該考慮使用一些框架,而不是手動完成。看看Zend_DbPDO(閱讀準備好的陳述)。

與PDO的一個例子:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 
try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 
$st = $dbh->prepare(' 
    INSERT INTO fruits(name, colour) 
    VALUES(:name, ":colour") 
'; 
$st->execute(array(':name' => 'Apple', ':colour' => 'red')); 
2

首先:在mysql_real_escape_string功能幫助防止SQL注入(在一定程度上),但它不是去固定最好這樣你數據庫。當不同的連接字符集沒有正確使用時,函數存在已知的漏洞,更重要的是,mysql函數是不再推薦。引用PHP.net:

不推薦使用此擴展名。

防止SQL注入的最好方法是使用prepared statements。要使用準備好的語句,您應該切換到PDO對象或mysqli

其次,你不應該真的在輸入上使用strip_tags。爲什麼?因爲如果用戶在標籤內輸入內容,那麼您將會遇到data integrity的損失。就我個人而言,我認爲strip_tags只能用於輸出。即當您顯示用戶輸入的數據時。

第三,strip_tags不會防範所有的XSS攻擊。就個人而言,爲了防範XSS;我會去這樣的事情:

echo htmlspecialchars($stringToOutput, ENT_QUOTES, 'UTF-8'); 

htmlspecialchars將所有的特殊字符轉換爲它們的相關HTML實體。