我目前正在使用此流程来清理/过滤用户输入的评论 - >
这个用于去除斜线......和
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.'<'.$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;
}
}
}
我只是想知道这是否足够安全,或者他们是否还有其他更好的选择......谢谢
答案 0 :(得分:5)
在考虑将数据存储到数据库时,最重要的是逃避它;使用mysql_real_escape_string
,mysqli_real_escape_string
或PDO::quote
,取决于您使用的数据库(或oracle / pg /...)的其他函数 < / p>
另一个解决方案是使用预准备语句(请参阅mysqli::prepare
和/或PDO::prepare
- 旧mysql_*
扩展名不支持这些语句),这些语句将处理转义数据你的位置; - )
在考虑HTML输出时,您有两个解决方案:
htmlentities
或htmlspecialchars
转义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)