2013-09-27 94 views
-4

我有一個php/mysql數據庫搜索。當我搜索html代碼時,如/ hr>標籤會改變頁面並創建/ hr>。我也想保護這從sql注入,但我不知道如何。哪裏可以在這裏插入mysql_real_escape_string?以及如何防止輸入html?

我可以在某處添加真正的轉義字符串嗎?或沒有?

<form action='trytosearch.php' method='GET'> 
<center> 
<h1>My Search Engine</h1> 
<input type='text' size='90' name='search'></br></br> 
<input type='submit' name='submit' value='Search here' ></br></br></br> 
</center> 


<?php 

$button = $_GET ['submit']; 
$search = $_GET ['search']; 

if(!$button) 
echo "you didn't submit a keyword"; 
else 
{ 
if(strlen($search)<=1) 
echo "Search term too short"; 
else{ 
echo "You searched for <b>$search</b> <hr size='1'></br>"; 
mysql_connect("localhost","me_abc","pass"); 
mysql_select_db("table"); 

$search_exploded = explode (" ", $search); 

foreach($search_exploded as $search_each) 
{ 
$x++; 
if($x==1) 
$construct .="keywords LIKE '%$search_each%'"; 
else 
$construct .="AND keywords LIKE '%$search_each%'"; 

} 

$construct ="SELECT * FROM listoga_db WHERE $construct"; 
$run = mysql_query($construct); 

$foundnum = mysql_num_rows($run); 

if ($foundnum==0) 
echo "Sorry, there are no matching result for <b>$search</b>.</br>"; 
else 
{ 
echo "$foundnum results found !<p>"; 

while($runrows = mysql_fetch_assoc($run)) 
{ 
$title = $runrows ['title']; 
$desc = $runrows ['description']; 
$link = $runrows ['link']; 

echo " 
<a href='$link'><b>$title</b></a><br> 
"; 

} 
} 

} 
} 

?> 
+0

可能的重複[如何防止SQL注入PHP?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) – Nanne

回答

0

你可以,但你應該看看MySQLiPDO擴展名,mysql_擴展名已折舊。

通常情況下,它會因爲你是從$ _GET或$ _POST提取數據使用:

$button = mysql_real_escape_string($_GET['submit']); 

注:之前可以做到這一點,你需要將你的電話mysql_connect()在使用mysql_real_escape_string()之前,因爲它需要連接資源才能使用。

0

使用本

$search = mysql_real_escape_string(strip_tags($_GET['search'])); 

,但我會建議使用MySQLiPDO參數化查詢。他們很受保護。

如果你想顯示標籤,你可以使用htmlentities。這樣可以確保在標籤的所有符號將被顯示爲符號,而不是真正的HTML標籤

$search = htmlentities(mysql_real_escape_string($_GET['search'])); 
+0

html標記是仍然通過。 –

+0

他們不能得到槽strip_tags。我測試了它。讓我看看哪個標籤被strip_tags錯過了。/hr>不是真正的標籤。


是一個標籤 – bksi

0

而不是在其他的答案,我會建議把逃逸作爲接近DB查詢儘可能。那麼做

foreach($search_exploded as $search_each) { 
    $search_each_esc = mysql_real_escape_string($search_each); 
    $x++; 
    if($x==1) 
     $construct .="keywords LIKE '%$search_each_esc%'"; 
    else 
     $construct .="AND keywords LIKE '%$search_each_esc%'"; 
} 

這樣做,你有整個程序運行正確的數據。與數據庫交互密切相關的轉義將與數據庫調用保持接近。

但是,正如其他人所說,這已被棄用。改用PDO或mysqli。

如果你這樣做了,並且你使用了準備好的語句,你也可以改變你需要的東西,並且也可以做到與數據庫交互接近。

相關問題