如何在php中使用htmlspecialchars()仅转义<script>标记

时间:2016-12-31 15:26:11

标签: php

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

&#xA;&#xA;
  $ str ='&lt; h2 contenteditable =“true”&gt;我不是一个好用户&lt; script&gt; alert(“hacked”)&lt; / script&gt; &LT; / H2&GT;'; &#xA;  
&#xA;&#xA;

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

&#xA;&#xA;
  echo htmlspecialchars($ str);&#xA;  
&#xA;&#xA ;

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

&#XA;

3 个答案:

答案 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之类的工具,该工具使用允许的标记和属性的白名单。