2

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

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

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

4

5 回答 5

5

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

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


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

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

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

于 2009-09-18T19:35:42.997 回答
3

不要编写自己的 HTML sanitizer。您将创建 XSS 漏洞。

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

在这些测试和过滤器的 htmlpurifier 比较之间,您应该能够很好地了解 html 清理的复杂程度——以及为什么要将它留给专业人士。

于 2009-09-18T19:47:20.640 回答
0

您的魔术引号处理很好,但如果您使用引号创建获取参数,您也需要对键进行剥离。:)

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

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

于 2009-09-18T19:32:52.940 回答
0

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

于 2009-09-18T19:43:54.423 回答
0

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

PHP中的输入过滤

filter_inputfilter_var

于 2009-09-19T00:54:45.020 回答