【问题标题】:htmlspecialchars and make links clickablehtmlspecialchars 并使链接可点击
【发布时间】:2016-08-07 06:02:36
【问题描述】:

我有一个处理用户输入的 PHP 脚本。我需要转义所有特殊字符,但还要使链接可点击(将它们变成<a> 元素)。我需要的是:

function specialCharsAndLinks($text) {
    // magic goes here
}
$inp = "http://web.page/index.php?a1=hi&a2=hello\n<script src=\"http://bad-website.com/exploit.js\"></script>";
$out = specialCharsAndLinks($inp);
echo $out;

输出应该是(在 HTML 中):

<a href="http://web.page/index.php?a1=hi&a2=hello">http://web.page/index.php?a1=hi&amp;a2=hello</a>
&lt;script src="http://bad-website.com/exploit.js"&gt;&lt;/script&gt;

请注意,链接中的符号保留在href 属性中,但在链接的实际内容中转换为&amp;amp;

在浏览器中查看时:

http://web.page/index.php?a1=hi&a2=hello

【问题讨论】:

    标签: php htmlspecialchars


    【解决方案1】:

    我最终解决了这个问题:

    function process_text($text) {
        $text = htmlspecialchars($text);
        $url_regex = "/(?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+(?:\/\S*)?/";
        $text = preg_replace_callback($url_regex, function($matches){
            return '<a href="'.htmlspecialchars_decode($matches[0]).'" rel="nofollow">'.$matches[0]."</a>";
        }, $text);
        return $text;
    }
    

    第一行对输入进行 html 编码。
    第二行定义 URL 正则表达式。可以改进,但现在工作。
    第 3 行使用 preg_replace_callback,这是一个类似于 preg_replace 的函数,但不是为它提供替换字符串,而是提供一个返回替换字符串的替换 函数
    第 4 行是实际功能。这是相当自我记录的。 htmlspecialchars_decode 撤消 htmlspecialchars 的操作(因此,如果链接包含符号,则使链接有效)。

    【讨论】:

      【解决方案2】:

      试试这个:

      $urlEscaped = htmlspecialchars("http://web.page/index.php?a1=hi&a2=hello");
      $aTag = '<a href="$urlEscaped">Hello</a>';
      echo $aTag;
      

      您的示例不起作用,因为如果转义整个 html 标记,a 标记将永远不会被浏览器处理,而只会显示为纯文本。

      如您所见,stackoverflow 会转义我们的整个输入(问题/答案...),因此我们可以实际看到代码,而不是让浏览器处理它。

      【讨论】:

      • 我的例子完美运行。渲染输出中的链接是一个&lt;a&gt; 标签。
      • 你想说你只看到“你好”吗? (已处理标签)
      • 好的,那为什么不直接解码内容呢? 内容 htmlspecialchars_decode()
      • 我可以对 URL 进行 html 解码(因为需要解码,可能是 url 编码),但其他一切都保持不变。此外,我有很长的文本,其中所有内容都可能不是 url,就像在新示例中一样。但是现在,我不能使用正则表达式,因为 preg_replace 不能调用函数。
      • 我仍然对你真正想要的东西感到困惑......在你的问题结束时,说“在浏览器中查看时:”你的意思是这是你想要的还是你想要的不想要?你在尝试什么样的 xss?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多