我的sql数据库中有一个来自用户的字符串。


 $ str ='< h2 contenteditable =“true”>我不是一个好用户< script> alert(“hacked”)< / script> < / H2>'; 



 如果我回应它,那么它就不好所以我使用htmlspecialchars();转义特殊的html chracters


 echo htmlspecialchars($ str);


&#xA ; 这将使我免于黑客入侵,但我想保留其他标签(如< h2>),因为它是,我不希望它改变,如果我只能使用特定标签转义它们是一种方式用htmlspecialchars();

答案 0 :(得分:0)
我认为 strip_tags()
正是您所寻找的。您可以将允许的标签添加到第二个参数
<击> 从PHP Docs
$strippedinput = strip_tags_attributes($nonverifiedinput,"<p><br><h1><h2><h3><a><img>","class,style");
function strip_tags_attributes($string,$allowtags=NULL,$allowattributes=NULL){
$string = strip_tags($string,$allowtags);
if (!is_null($allowattributes)) {
if(!is_array($allowattributes)) $allowattributes = explode(",",$allowattributes);
if(is_array($allowattributes)) $allowattributes = implode(")(?<!",$allowattributes);
if (strlen($allowattributes) > 0) $allowattributes = "(?<!".$allowattributes.")";
$string = preg_replace_callback("/<[^>]*>/i",create_function( '$matches', 'return preg_replace("/ [^ =]*'.$allowattributes.'=(\"[^\"]*\"|\'[^\']*\')/i", "", $matches[0]);' ),$string);
}
return $string;
}
击> <击> 撞击>
正如Gerrit0指出的那样,你不应该使用正则表达式来解析HTML
答案 1 :(得分:0)
我准备提出一些非常基本的正则表达式,但我在这里找到了:
https://stackoverflow.com/a/7131156/6219628
在阅读了更多文档之后,我没有找到任何可以忽略htmlspecialchars()的特定标签的东西,这听起来并不令人惊讶。
编辑:因为使用正则表达式解析HTML似乎是邪恶的,你最终可能会喜欢阅读这个笨重的答案:) https://stackoverflow.com/a/1732454/6219628答案 2 :(得分:0)
请注意,仅删除<script>
代码并不足够;用户可以通过许多其他方式将恶意内容注入您的网站。
如果您想限制用户可以输入的HTML标记,请使用HTML Purifier之类的工具,该工具使用允许的标记和属性的白名单。