-4

php/mysql db検索があります。/hr> タグのような html コードを検索すると、ページが変更されて /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

他の回答とは対照的に、エスケープをできるだけ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%'";
}

そうすることで、プログラムの実行全体を通して正しいデータが得られます。また、DB インタラクションに密接に関連するエスケープは、DB 呼び出しの近くに保持されます。

しかし、他の人も言っているように、これは非推奨です。代わりに PDO または mysqli を使用してください。

そうする場合、準備されたステートメントを使用すると、必要なものを変更し、DB インタラクションの近くでそれを行います。

于 2013-09-28T12:56:56.560 に答える