正则表达式是不是足够或我需要更多检查?

Posted

技术标签:

【中文标题】正则表达式是不是足够或我需要更多检查?【英文标题】:Is the regular expression enough or I need some more checks?正则表达式是否足够或我需要更多检查? 【发布时间】:2018-12-21 22:53:21 【问题描述】:

我有一个搜索,当用户输入关键字时,脚本会在数据库中查找该关键字:

<form method="GET">
    <input type="text" name="q" id="keyword" placeholder="Enter a keyword" > 
    <input type="submit" value="Search" >
</form>

提交表单后,我会检查以下内容:

//Check is the form is submitted.
if( isset($_GET['q']) )

    //Assign the submitted keyword to a variable.
    $query = $_GET['q'];

    //Check if the keyword is empty.
    if(!empty($query))

        //Check if the keyword matches the pattern.
        //The pattern checks that the keyword contains characters from any language and maybe there are spaces between them.
        $pattern = "~^\pL[\pL\pM\h()]*$~u";

        //If the keyword matches the pattern.
        if(preg_match($pattern, $query))

            //Fetch data from the Database.
            $stmt = $conn->prepare('SELECT * FROM posts WHERE title OR description LIKE  :s LIMIT 5');
            $stmt->bindValue(':s', '%' . $query . '%', PDO::PARAM_STR);
            $stmt->execute();
            $posts = $stmt->fetchAll();

        
    

这些检查是否足以阻止 SQL 注入和其他攻击?

或者我需要创建一个黑名单?或者检查其他东西?

【问题讨论】:

将值绑定到语句这一事实足以防止 SQL 注入 - 其他任何事情都可能是多余的。 如果您稍后将$query 输出到浏览器,您可能会对 XSS 注入开放。不相关但title OR description LIKE 有效? @user3783243,喜欢在搜索输入中插​​入关键字$querytitle OR description LIKE 有事吗? title OR description LIKE 不像你想象的那样工作。它只是声明title 必须存在(不为空,一个真实值),或者description like something。所以......我怀疑结果将是这方面的预期行为。 如果您稍后执行&lt;input type="text" value="&lt;?php echo $query;?&gt;"&gt;,您将对 XSS 注入持开放态度,因为" 将关闭该属性,然后其余输入将转到 DOM,例如" onclick="alert('injected')". 【参考方案1】:

由于您使用的是参数化查询,因此您根本不需要正则表达式。参数化查询和仅连接参数之间的区别在于查询最终是如何执行的。例如:

query q = "SELECT * FROM people WHERE people.age =" + userInput;

这样查询将被连接起来,然后纯粹执行。在您的情况下,您将用户输入作为参数传递:

query q = "SELECT * FROM posts WHERE title OR description LIKE  :s LIMIT 5"

它不会直接连接采石场,它将比较参数s的值。确保始终使用参数化查询,因为这是一种很好的做法,而且更安全

【讨论】:

是否包括 $stmt-&gt;execute( [$query] ) ?还是只是`$stmt->bindValue`? @Dan 这就是您的查询的执行方式。绑定本身只是提供您的查询期望的参数以便可执行。我希望这很有用。 那么如果没有bindValue就没有问题? @Dan 不,绑定本身是防止代码被 SQL 注入的主要因素。 如果有多个变量怎么办?我应该像$stmt-&gt;bindValue(':s', '%' . $query . '%', PDO::PARAM_STR); $stmt-&gt;bindValue(':a', $name, PDO::PARAM_STR);一样绑定它们吗?

以上是关于正则表达式是不是足够或我需要更多检查?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,检查是否没有更多的斜线

这个 Python 正则表达式对于电子邮件地址是不是足够好? [复制]

检查字符串是不是以正则表达式数字开头

检查行是不是匹配正则表达式

只需要一个正则表达式来检查字符串中的“2 个字母和 4 个数字”

正则表达式:检查是不是有超过 x 个换行符