【发布时间】:2019-08-03 19:50:47
【问题描述】:
使用 html 表单和 PHP 创建一个搜索栏来查询 MySQL 数据库。 PHP 代码正在从数据库中返回行,但我正在努力清理搜索栏中的输入字符串。请问有人可以为我的PHP代码推荐一种有效的方法吗?
我尝试了《PHP、MySQL 和 Javascript - 第 5 版》一书中的一些函数以及 Filter_var 和 htmlEntities 函数。
而且我仍然可以输入反斜杠或 html 实体来修改搜索功能的回显 html 输出。
<?php
echo <<<_End
<form action="InsertLike2.php" method="post"><pre>
<textarea name="Message" rows="1" cols="30"></textarea>
<input type="submit" value="Search">
</pre></form>
_End;
require_once 'login.php';
$conn = new mysqli($hn, $un, $pw, $db);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(!empty($_POST))
{
$searchStr = $_POST['Message'];
$searchStr = htmlentities($searchStr);
$searchStr = filter_var($searchStr, FILTER_SANITIZE_STRING);
$aKeyword = explode(" ", $searchStr);
$query ="SELECT * FROM MessageMain WHERE MessageText like '%" . $aKeyword[0] . "%'";
for($i = 1; $i < count($aKeyword); $i++) {
if(!empty($aKeyword[$i])) {
$query .= " OR MessageText like '%" . $aKeyword[$i] . "%'";
}
}
$result = $conn->query($query);
echo "<br>You have searched for keywords: " . $_POST['Message'];
if(mysqli_num_rows($result) > 0) {
$row_count=0;
echo "<br>Result Found: ";
While($row = $result->fetch_assoc()) {
$row_count++;
echo "<pre> Message". "</pre>". nl2br(htmlspecialchars($row['MessageText'],ENT_COMPAT|ENT_IGNORE, "UTF-8") );
}
}
else {
echo "<br>Result Found: NONE";
}
}
//Examples of different functions used
function get_post($conn, $var)
{
return $conn->real_escape_string($_POST[$var]);
}
function mysql_entities_fix_string($connection,$string)
{
return htmlentities(mysql_fix_string($connection,$string));
}
function mysql_fix_string($connection,$string)
{
if(get_magic_quotes_gpc()) $string = stripslashes($string);
return $connection->real_escape_string($string);
}
?>
我希望 html 实体或反斜杠(注入攻击被过滤掉或变得无害)。
【问题讨论】:
-
该方法在手册中有描述:SQL Injection。您不需要太多清理,只是不要将输入直接放在查询字符串中。
-
使用
prepared statement,而不是直接在sql中嵌入变量 -
@KIKOSoftware 我不确定这意味着什么对不起。我在在线测试搜索功能时发现的一件事是,输入“网球
”之类的内容会改变回显搜索结果的格式。我认为这是一个不好的迹象。
-
@RamRaider 会解决 XSS 攻击的威胁吗?
-
很抱歉,关于 SQL 注入的手动输入您不清楚,但它仍然是您代码中最大的安全漏洞。试着再读一遍。您可以使用htmlentities() 将在 HTML 中具有特殊含义的字符转换为它们的“实体”。在回显搜索结果时使用它,而不是之前。