【问题标题】:How to use htmlspecialchars() but keep the <a> tag along with others in PHP?如何使用 htmlspecialchars() 但在 PHP 中将 <a> 标记与其他标记一起保留?
【发布时间】:2018-06-23 09:55:21
【问题描述】:

我正在尝试使用 htmlspecialchars() 但想保留以下标签:

&lt;a&gt;&lt;b&gt;&lt;i&gt;

我该怎么做呢?

我发现的解决方案似乎不能与属性标签和普通普通标签一起使用。

这是我发现的一段代码,它应该允许带有属性的标签:

function fix_attributes($match){
    return "<".$match[1].str_replace('&quot;','"',$match[2]).">";
}
function allow_only($str, $allowed){
    $str = htmlspecialchars($str);
    foreach( $allowed as $a ){
        $str = preg_replace_callback("/&lt;(".$a."){1}([\s\/\.\w=&;:#]*?)&gt;/", fix_attributes, $str);
        $str = str_replace("&lt;/".$a."&gt;", "</".$a.">", $str);
    }
    return $str;
}
echo allow_only('This is <b>bold</b> and <a href="http://www.#links">this</a> is <i>italic</i>.', array("b","a","i"));

Source

但是,它一直给我一个错误:Use of undefined constant fix_attributes

如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 如果您想保留某些标签,请改用strip_tags()
  • @FunkFortyNiner 虽然这是一个很好的通用解决方案,但值得注意的是strip_tags() 确实存在许多问题,并且经常会给出糟糕的回报(乱码)。某种形式的(非常复杂的)正则表达式可能会起作用,但这是一个很大的答案......
  • 如果您想在preg_replace_callback 中使用命名回调,您必须将函数名称作为字符串传递;即'fix_attributes'。那应该可以解决您的错误消息。但我不能告诉你正则表达式是否保存/良好。
  • @jh1711 谢谢!但是,它似乎不允许 &lt;? 作为输入并导致 Forbidden 'error'

标签: php xss sanitization htmlspecialchars html-sanitizing


【解决方案1】:

问题:使用不带引号的回调函数

更多信息见http://php.net/manual/en/function.preg-replace-callback.php

 <?php
    function fix_attributes($match){
        return "<".$match[1].str_replace('&quot;','"',$match[2]).">";
    }
    function allow_only($str, $allowed){
        $str = htmlspecialchars($str);
        foreach( $allowed as $a ){
            $str = preg_replace_callback("/&lt;(".$a."){1}([\s\/\.\w=&;:#]*?)&gt;/", "fix_attributes", $str);//use quotes here 
            $str = str_replace("&lt;/".$a."&gt;", "</".$a.">", $str);
        }
        return $str;
    }
    echo allow_only('This is <b>bold</b> and <a href="http://www.#links">this</a> is <i>italic</i>.', array("b","a","i"));
    ?>

【讨论】:

  • 感谢您的回复!这可行,但似乎不允许&lt;?htmlspecialchars() 通常接受和消毒。将其作为输入会导致 Forbidden 错误。
  • 设法解决了这个问题,我不得不禁用Mod_Security
猜你喜欢
  • 2011-02-19
  • 2012-03-15
  • 2014-05-07
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多