-4

我有一个 php/mysql 数据库搜索。当我搜索 html 代码(如 /hr> 标记)时,它会更改页面并创建 /hr>。我还想保护它免受 sql 注入,但我不知道如何。

我可以在某处添加真正的转义字符串吗?或没有?

<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>
";

}
}

}
}

?>
4

4 回答 4

1

它会像这样使用。

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

但请注意,mysql_real_escape_string自 PHP 5.5.0 起已弃用。

http://se2.php.net/manual/en/function.mysql-real-escape-string.php

考虑改用PDO

于 2013-09-27T23:36:18.697 回答
0

可以,但您应该查看MySQLiPDO扩展,mysql_ 扩展已被贬值。

通常,它会在您从 $_GET 或 $_POST 中提取数据时使用:

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

注意:执行此操作之前,您需要在使用之前移动您的mysql_connect()呼叫,mysql_real_escape_string()因为它需要连接资源才能工作。

于 2013-09-27T23:39:27.370 回答
0

用这个

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

但我建议使用MySQLiPDO参数化查询。他们受到很大的保护。

如果要显示标签,可以使用 htmlentities。这样您就可以确保标签中的所有符号都显示为符号,而不是真正的 html 标签

$search = htmlentities(mysql_real_escape_string($_GET['search']));
于 2013-09-27T23:39:59.107 回答
0

与其他答案相反,我建议将转义尽可能靠近数据库查询。也一样

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%'";
}

这样做,您将在整个程序运行过程中获得正确的数据。并且与 DB 交互密切相关的转义将保持在 DB 调用附近。

但是,正如其他人所说,这已被弃用。请改用 PDO 或 mysqli。

如果您这样做,并且使用准备好的语句,那么您也可以更改您需要的内容,并且也可以在 DB Interactions 附近进行操作。

于 2013-09-28T12:56:56.560 回答