2013-09-27 63 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。

如果你这样做了,并且你使用了准备好的语句,你也可以改变你需要的东西,并且也可以做到与数据库交互接近。

相关问题