【发布时间】:2012-05-06 08:25:56
【问题描述】:
我不久前发布了这个问题,它非常适合从用户生成的帖子中查找和“链接”链接。 Linkify Regex Function PHP Daring Fireball Method
<?php
if (!function_exists("html")) {
function html($string){
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
}
if ( false === function_exists('linkify') ):
function linkify($str) {
$pattern = '(?xi)\b((?:(http)s?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))';
return preg_replace_callback("#$pattern#i", function($matches) {
$input = $matches[0];
$url = $matches[2] == 'http' ? $input : "http://$input";
return '<a href="' . $url . '" rel="nofollow" target="_blank">' . "$input</a>";
}, $str);
}
endif;
echo "<div>" . linkify(html($row_rsgetpost['userinput'])) . "</div>";
?>
我担心将用户生成的内容插入链接可能会带来安全风险。在通过 linkify 函数运行它并回显到页面之前,我已经使用 htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 转义了来自我的数据库的用户内容,但是我在 OWASP 上读到需要对链接属性进行特殊处理以缓解 XSS。我认为这个功能没问题,因为它将用户生成的内容放在双引号内,并且已经用htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 转义,但非常感谢具有 xss 专业知识的人来确认这一点。谢谢!
【问题讨论】:
-
如果不受信任的输入被放置到 href、src 或其他基于 URL 的属性中,则应该对其进行验证以确保它没有指向意外的协议,尤其是 Javascript 链接。然后应该像任何其他数据一样根据显示的上下文对 URL 进行编码。例如,HREF 链接中的用户驱动 URL 应该是属性编码的。给出的示例是 Java 中的。不知道如何在 PHP 中实现...code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/…
-
-1 这很尴尬,你需要测试你的代码。
-
请查看完整代码的已编辑问题。
-
@Jeff,您的代码实际上很不安全,因为 htmlspecialchars 不会删除任何标签。所以有人可以添加
<script>...</script>。在该脚本中可能很难做任何事情,因为不允许使用引号,但我不会依赖它。请改用htmlentities()。