清理/过滤用户评论的最佳方法?

时间:2009-09-18 19:26:05

标签: php filter sanitize

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

 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;
                    }
            }
        }

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

5 个答案:

答案 0 :(得分:5)

在考虑将数据存储到数据库时,最重要的是逃避它;使用mysql_real_escape_stringmysqli_real_escape_stringPDO::quote,取决于您使用的数据库(或oracle / pg /...)的其他函数 < / p>

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


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

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

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

答案 1 :(得分:3)

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

如果您要自己编写,至少运行ha.ckers.org xss smoketests对抗

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

答案 2 :(得分:0)

你的魔术引号处理很好,但是如果你用引号创建get参数,你也需要使用条带。 :)

对于条带标签,最好使用真正的HTML过滤器库。有很多曲折涉及html,你不应该相信你曾经做过的任何事情而忘记了。人们花时间制作这些HTML过滤器,以便利用他们的工作。

对于“直接进入DB”,在绑定参数中,确定,这很好。您可以安全地将任何内容放入绑定参数中。在带引号的字符串中,我希望你能逃避结果。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

PHP鲜为人知,但功能强大的内置卫生功能。我建议使用它们:

Input filtering in PHP

filter_inputfilter_var

相关问题