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

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

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

有帮助吗?

解决方案

不要写自己的HTML消毒剂。您将创建XSS漏洞。

如果你打算写自己的,至少运行 ha.ckers.org XSS smoketests 反对

这些测试之间,以及 htmlpurifier过滤器的比较,你应该能够得到一个好主意多么复杂的HTML清理是 - 你应该和它为什么留下的利弊

其他提示

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

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


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

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

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

您魔术引号的处理是好的,但如果创建尽快与您需要的stripslashes按键太报价参数。 :)

至于条代码,则关断一个真正的HTML滤波器库更好。有这么多的波折参与到HTML,你只是不应该相信什么,你只是做一次,忘了。人们花时间做那些HTML过滤器,以便使用他们的工作,你的优势。

至于“直入DB”,以及在绑定的参数,当然,这是伟大的。您可以放心地将任何东西放入一个绑定参数。在用引号括起来的字符串,我希望你逃避的结果。

在数据库puting当它逃逸的所有字符。检索和显示时确保逸出HTML格式化如<sometag>,使其显示,而不是被当作代码。

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

PHP 中的输入过滤

过滤器输入过滤器变量

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top