2013-06-21 30 views
1

我有一個列表電影的表格,並且我已經包含了一個簡單的搜索功能。 我有一個文本字段的形式可以輸入標題或關鍵字,然後表單被提交。一個簡單的PHP搜索表單的安全

PHP/MySQL的代碼,做的工作是:

$find = $_POST['find']; 
$find = mysql_real_escape_string($find); 
$find = htmlspecialchars($find); 
$sql = "SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE '%".$find."%' ORDER BY title"; 

其中「發現」是在搜索表單文本輸入的名稱。

這適用於所需目的的搜索功能。

我所有的問題是:

是的mysql_real_escape_string並用htmlspecialchars足以讓我的搜索表單安全嗎?

我已經閱讀了關於此問題的所有關於stackoverflow的問題,但我真的很希望有人知道對我說「是的,這就是你需要的」,或者「不,你也是需要考慮......「。

在此先感謝。 乾杯。

回答

1

是的,它是足夠的,以確保安全......你總是可以在那裏也拋出用strip_tags()....

雖然我只是做了一個線......而不是使用3

$find = htmlspecialchars(mysql_real_escape_string($_POST['find'])); 

但要真正使安全和最新的,應停止使用mysql_ *功能,因爲它們已被棄用,並將在未來的PHP relases被移除....

你應改爲切換到mysqli_ *或PDO,並執行處理s的預處理語句爲您提供安全保障。

比如...在PDO

$db = new PDO('mysql:server=localhost;dbname=test', 'username', 'password'); 

    $find = $_POST['find']; 

    $query = $db->prepare('SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE :like ORDER BY title'); 
    $query->bindValue(':like', '%' . $find . '%'); 
    $query->execute(); 
+0

感謝KyleK,我必須說,我從來沒有聽說過下去,但我自學,所以我的知識是不完整的,而且我現在只有這麼幾年了。我會考慮PDO。再次感謝 – Almeister9

2

記住一句諺語:濾器,逃了出去

你不是在那裏輸出這個術語,那麼爲什麼你爲了HTML目的而用htmlspecialchars()轉義它?

相反,只能將其轉義爲數據庫(您應該使用準備好的語句,但那是另一點)。所以你應該不是在那裏使用htmlspecialchars。相反,當你將這個變量輸出到HTML頁面上時,這就是你應該將它轉義爲HTML的時候(同樣使用htmlspecialchars)。

現在,你混合數據庫和HTML逃逸,這是會導致既不是有效...

+1

+1。由於不恰當的轉義,無法搜索與(或其他HTML特殊字符)中的&符號相關的術語。逃避不是您在輸入階段可以解決的問題。 – bobince