2010-09-11 24 views
2

這個問題一直在我腦海中演變,我如何完全阻止用戶輸入一些瘋狂的SQL注入。是不是mysql_real_escape_string強大到足以阻止它?我遵循了一些指導原則,雖然有些用戶在這裏批評我的代碼,併爲我的安全性給了我大拇指。我無法理解它背後的原因。雖然我沒有使用$ _GET,但唯一的用戶輸入是通過評論系統。我只是想確保我不會出錯。這裏是我的示例代碼。幫助我阻止用戶輸入有害代碼

$name = htmlspecialchars(strip_tags(mysql_real_escape_string($_POST['com_name']))); 

我對5個字段使用了相同的內容。你對我的上面的代碼有什麼看法?

回答

1

這個想法並不是阻止用戶輸入它,而是確保您安全地將它們輸入到數據庫查詢中。這意味着使用mysql_real_escape_string或使用參數化查詢與mysqli

/* Prepare an insert statement */ 
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)"; 
$stmt = mysqli_prepare($link, $query); 

mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3); 

你也需要讓你從數據庫中讀取確保您正確HTML編碼領域,以避免用戶能夠注入HTML(以及JavaScript的)

+0

我不希望我的用戶輸入任何html或javascript代碼,它應該只是這個項目的普通文本。你不覺得我的代碼正在照顧它嗎? – 2010-09-11 09:05:59

+0

您的通用代碼應允許用戶將任何(有效)數據插入到數據庫中。如果你需要額外的過濾,那麼你應該在單獨的驗證階段進行,而不是在數據庫中輸入。 – Quamis 2010-09-11 09:33:08

+0

@Quamis我想這就是我正在做的,我先過濾代碼,然後將它傳遞給數據庫,我從來沒有將它直接傳遞給數據庫。糾正我,如果我錯了。 – 2010-09-11 09:47:56

2

如果您將用戶輸入插入到數據庫中,那麼mysql_real_escape_string就足夠了。更好的是,利用準備好的語句 - PDO或MySQLi。

如果你只是在網頁上顯示的用戶數據,你應該利用htmlspecialchars()htmlentities()

至於你已經發布的代碼。讓我們分解它。

  • htmlspecialchars - 將html 字符轉換爲相應的實體。
  • strip_tags - 之前,DB進入 字符轉義 - 刪除HTML和PHP從代碼
  • mysql_real_escape_string 標籤。

所以,正如你所看到的,你使用的前兩個功能看起來相當反效果。你正在將HTML字符轉換成實體,但你也剝離了標籤。

爲了確保在數據庫條目mysql_real_escape_string就足夠了之前確保用戶輸入安全。或者正如我前面提到的那樣,利用準備好的陳述。

+0

mysql_real_escape_string是不夠的。 mysql_real_escape_string **加引號**將 – 2010-09-11 09:58:38

2

如果無法找到或創建與數據庫的連接,則可能會致電mysql_real_escape_string

在我實際執行查詢之前,我傾向於儘可能深地調用此類調用。它可能會使我的性能略微下降,但我不必擔心會丟失更高的參數(就sql注入而言),並且我知道在那時我總是有一個有效的數據庫連接。

我還對所有用戶輸入做的第一件事是在執行任何其他操作之前,通過帶有FILTER_SANITIZE_SPECIAL_CHARS的filter_var運行它。

+0

沒有什麼可以殺死任何性能,但是你沒有看到正確的理由將「在查詢之前」進行轉義。這不是因爲這個貧窮世界的每個人都認爲需要輸入數據的轉義。但對於SQL查詢。所以,在查詢之前就是唯一可能的地方。 – 2010-09-11 09:58:07

+0

啊,是的,我明白你要出去的是什麼。感謝您指出不太明顯的內容。 :) – 2010-09-11 14:20:51

2

不,您的代碼不太安全,甚至不太明智。

這裏是a complete answer about SQL injections I posted before
總之,mysql_real_escape_string本身並不保護任何東西。它僅在您將數據放入引號時纔有效。

至於htmlspecialchars/strip_tags,與SQL無關,它是HTML保護,而不是SQL。 並且使用它們都是多餘的。其中只有一個就足夠了。我更喜歡htmlspecialchars。