题
我目前正在使用此过程来清理/过滤用户输入的评论 ->
这个是用来去掉斜线的...和
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;
}
}
}
我只是想知道这是否足够安全或者是否有其他更好的选择......谢谢
解决方案
不要写自己的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>
,使其显示,而不是被当作代码。