消毒从用户/过滤评论的最佳方式?(Best way to Sanitize / Filter Com

2019-08-07 20:40发布

我目前使用这种方法消毒用户输入的/过滤评论 - >
这一个是用于去除斜线......和

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

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

Answer 1:

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

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

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



Answer 2:

考虑将数据存储到数据库时,最重要的是要逃避它; 使用mysql_real_escape_string ,或mysqli_real_escape_string ,或PDO::quote ,这取决于你所使用的数据库(或其他功能的Oracle / PG / ...)

另一种解决方案是使用准备好的发言(见mysqli::prepare和/或PDO::prepare -那些不被支持的老mysql_*扩展名),将处理在你家;-)逃脱数据


当考虑HTML输出,有两种解决方法:

  • 接受HTML和使用一些图书馆像HTMLPurifier过滤/清洗干净; 它将允许指定哪些标记和属性是允许的,并给你清洁,有效的HTML作为输出。
  • 尝试删除HTML,像你doinig - 并不总是行之有效(如果你忘了一些特殊的情况?)
  • 逃脱的HTML,与htmlentitieshtmlspecialchars :不一定好看,但输出将类似于用户的输入。

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



Answer 3:

你的魔术引号的处理是好的,但如果创建得到与报价参数需要的stripslashes的按键了。 :)

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

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



Answer 4:

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



Answer 5:

PHP已经小有名气,但功能强大的内置功能卫生。 我会建议使用它们:

在输入滤波PHP

filter_input和filter_var



文章来源: Best way to Sanitize / Filter Comments from users?