繁体   English   中英

动态创建的搜索查询不安全

[英]Search query dynamically created is unsafe

// Check and set search
if($_POST['searchQuery'] !== "null"){
    $search = $_POST['searchQuery'];

    $search = explode(' ', $search);


    //long words are more than 4
$longwords = '';
$shortwords = '';


$searchCount = count($search);

foreach ($search as $word) {
    $word = trimplural($word);

    if ($searchCount > 1){

       if (strlen($word) > 3) {
           if (!in_array($word,array('sale','brand','lots'))){
                  $longwords.=' +'.$word;
                    } //check for words
        }else{ //else 3 letters
                    if (strlen($word) == 3) {
                        if (!in_array($word,array('and','the','him','her','for','new','you'))){
                               $shortwords.= " OR (fname LIKE '%$word%' OR lname LIKE '%$word%') ";
                            } //search for words
                     }//strlen == 3
        }

    }else{//else searchcount == 1
                            if (!in_array($word,array('and','the','him','her','for','new','you'))){
                               $shortwords.= " OR (fname LIKE '%$word%' OR lname LIKE '%$word%') ";
                      } 
     }


}



}else{
    $search = null;
}

SQL:

$sql = "SELECT * FROM people WHERE MATCH (lname,fname) AGAINST (:longwords IN BOOLEAN MODE) $shortwords LIMIT " . $postnumbers . " OFFSET ".$offset;
    $q1  = $conn->prepare($sql) or die("failed!");
    $q1->bindParam(':uniid', $uniid, PDO::PARAM_STR);
    $q1->bindParam(':longwords', $longwords, PDO::PARAM_STR);
    $q1->execute();

我有一个使用上面显示的代码生成的搜索查询,我想结合使用mysql全文搜索和LIKE查询。 为此,我将SQL查询的一部分添加为$shortwords变量,以使LIKE部分正常工作,但是,我知道由于sql注入,这并不是最佳选择。

在实施到SQL之前,如何使此查询“更安全”或清理输出?

创建子句时,请在$ word变量上使用PDO :: quote,然后再将其添加到字符串中,它将清理并转义该值。 然后,您不需要将shortParam与bindParam绑定,但是可以获得相同的功能。

这样的事情应该工作:

if (!in_array($word,array('and','the','him','her','for','new','you'))){
    $safe = $conn->quote('%'.$word.'%');
    $shortwords.= " OR (fname LIKE $safe OR lname LIKE $safe) ";
} //search for words

尽管offset和postnumber并不是很容易受到注入的影响,但绑定它们仍然可能会很好,这将使查询更具可读性,但这仅是我的看法。

另外,您可能需要考虑在foreach之外定义单词列表数组。 当前,解释器在循环的每次迭代中都在重建数组。 同样,这不是什么大问题,但值得一提。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM