【问题标题】:How to Sanitise Search Bar String in PHP如何在 PHP 中清理搜索栏字符串
【发布时间】: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 中具有特殊含义的字符转换为它们的“实体”。在回显搜索结果时使用它,而不是之前。

标签: php html mysql


【解决方案1】:

当您将变量回显为 html 时,如果您看不到转义字符串,这并不奇怪。

使用 var_dump 查看转义字符串。

var_dump(nl2br(htmlspecialchars($row['MessageText'],ENT_COMPAT|ENT_IGNORE, "UTF-8") ));

你会看到魔法。

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多