【问题标题】:Best way to Sanitize / Filter Comments from users?清理/过滤用户评论的最佳方法?
【发布时间】:2009-09-18 19:26:05
【问题描述】:

我目前正在使用此过程来清理/过滤用户输入的评论 ->
这个是用来去除斜线的......和

 if (get_magic_quotes_gpc()) {
        function stripslashes_deep($value)
        {
            $value = is_array($value) ?
                        array_map('stripslashes_deep', $value) :
                        stripslashes($value);

            return $value;
        }

        $_POST = array_map('stripslashes_deep', $_POST);
        $_GET = array_map('stripslashes_deep', $_GET);
        $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
        $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
    }

然后评论通过这个函数来清理数据...

   function my_strip_tags($str) {
                $strs=explode('<',$str);
                $res=$strs[0];
                for($i=1;$i<count($strs);$i++)
                {
                    if(!strpos($strs[$i],'>'))
                        $res = $res.'&lt;'.$strs[$i];
                    else
                        $res = $res.'<'.$strs[$i];
                }
             return strip_tags($res);   
    }

在此之后,它使用准备好的语句直接进入数据库..

function add_comment($comment,$type,$update_id,$user_id){
            $query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
                if($stmt=$this->conn->prepare($query)) {
                $stmt->bind_param('sss',$update_id,$user_id,$comment);
                $stmt->execute();
                    if($this->conn->affected_rows==1){
                    $stmt->close();
                    return true;
                    }
            }
        }

我只是想知道这是否足够安全,或者它们是否还有其他更好的选择...谢谢

【问题讨论】:

    标签: php filter sanitize


    【解决方案1】:

    在考虑将数据存储到数据库时,最重要的是转义它;使用mysql_real_escape_string,或mysqli_real_escape_string,或PDO::quote,具体取决于您使用的数据库(或oracle/pg/...的其他函数)

    另一种解决方案是使用准备好的语句(请参阅mysqli::prepare 和/或PDO::prepare - 旧的mysql_* 扩展不支持这些语句),它将处理您所在位置的转义数据;-)


    在考虑 HTML 输出时,您有两种解决方案:

    • 接受 HTML 并使用诸如HTMLPurifier 之类的库来过滤/清理它;它将允许准确指定允许的标签和属性,并为您提供干净有效的 HTML 作为输出。
    • 尝试删除 HTML,就像你正在做的那样 - 并不总是很好(如果你忘记了一些特殊情况怎么办?)
    • 转义 HTML,使用 htmlentitieshtmlspecialchars :不一定好看,但输出看起来像用户的输入。

    我会选择第一个或最后一个解决方案;你的感觉更“危险”——但这只是一种感觉 ^^ (一般的想法是“不要重新发明轮子”)

    【讨论】:

    • 如果我使用准备好的语句插入数据会怎样(*编辑后)...我还应该使用 mysql_real_escape_string 吗??
    • 没有。准备好的语句为您处理转义。
    【解决方案2】:

    不要编写自己的 HTML 清理程序。您将创建 XSS 漏洞。

    如果你要自己写,至少运行 ha.ckers.org xss smoketests 反对它

    在这些测试和 htmlpurifier comparison of filters 之间,您应该能够很好地了解 html 清理的复杂程度,以及为什么要将其留给专业人士。

    【讨论】:

    • “不要编写自己的 HTML 清理程序。你会创建 XSS 漏洞。”根据你的说法,没有洞是不可能造出来的,如果你用别人做的1,那就意味着如果它是由人建造的,它也有洞。所以我不同意 100%
    • 我只是说他会制造漏洞。我没有说每个人都会。 XSS 很复杂——这就是为什么即使是最大的网站也总是成为它的受害者。如果您必须问“这是否安全?”,那么您的知识还不够接近,无法编写对您的应用安全至关重要的内容。即使对于最有经验的开发人员来说,HTML 清理也很难做到正确。
    • @jasondavis - 如果有人写了别人的消毒剂怎么办? :)
    【解决方案3】:

    您的魔术引号处理很好,但如果您创建带引号的 get 参数,您也需要去除键。 :)

    至于条形标签,最好使用真正的 HTML 过滤器库。 html 有很多曲折,你不应该相信任何你只做一次就忘记的东西。人们会花时间制作这些 HTML 过滤器,因此请充分利用他们的工作。

    至于“直接进入数据库”,在绑定参数中,当然,这很棒。您可以安全地将任何内容放入绑定参数中。在带引号的字符串中,我希望您转义结果。

    【讨论】:

    • 你有提到的任何好的 html 过滤器库的链接吗?
    • 我不想列出任何一个,因为我只真正使用过 htmLawed,所以我不能给出一个以上的例子。但还有其他人。谷歌:“PHP HTML 过滤器库”
    【解决方案4】:

    将其放入数据库时​​转义所有字符。检索和显示时,请确保转义 html 格式,例如 &lt;sometag&gt;,以便显示而不是被视为代码。

    【讨论】:

      【解决方案5】:

      PHP 有一些鲜为人知但功能强大的内置清理功能。我建议使用它们:

      Input filtering in PHP

      filter_inputfilter_var

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        相关资源
        最近更新 更多