Php 将URL转换为链接安全吗?

Php 将URL转换为链接安全吗?,php,xss,sanitization,htmlpurifier,html-entities,Php,Xss,Sanitization,Htmlpurifier,Html Entities,我想把用户评论中的URL变成链接 我没有时间测试像HTMLPurify这样臃肿的反xss库,所以我不允许使用任何HTML标记 我只想让所有内容都经过htmlentities()和nl2br(),然后使用preg_replace()查找URL并将它们转换为链接(“a”html标记) 抓取我找到的URL并将它们放在href=''中是否不安全 如果没有,我能做些什么 是的,应该是安全的。如果你想知道怎么做,这里有一个我用于此的函数(为了本文的目的,我简化了它): 函数formatPost($strin

我想把用户评论中的URL变成链接


我没有时间测试像HTMLPurify这样臃肿的反xss库,所以我不允许使用任何HTML标记

我只想让所有内容都经过htmlentities()和nl2br(),然后使用preg_replace()查找URL并将它们转换为链接(“a”html标记)

抓取我找到的URL并将它们放在href=''中是否不安全


如果没有,我能做些什么

是的,应该是安全的。如果你想知道怎么做,这里有一个我用于此的函数(为了本文的目的,我简化了它):

函数formatPost($string){
返回nl2br(
preg_replace_回调(
“~https?:/([^/\s]+)(?:/((?>[/\w]+|\s(?!\s |$)*))?~”,
函数($matches){
$url=$matches[0];
$host=$matches[1];
$path=isset($matches[2])?$matches[2]:“”;
$follow=false;
如果(''=$path){
$text=$host;
}elseif($\u服务器['HTTP\u主机]==$HOST){
$text=$path;
$follow=true;
}否则{
$text=$host.'/'.$path;
}
返回“”;
},
htmlspecialchars($string)
)
);
}

是的,应该是安全的。如果你想知道怎么做,这里有一个我用于此的函数(为了本文的目的,我简化了它):

函数formatPost($string){
返回nl2br(
preg_replace_回调(
“~https?:/([^/\s]+)(?:/((?>[/\w]+|\s(?!\s |$)*))?~”,
函数($matches){
$url=$matches[0];
$host=$matches[1];
$path=isset($matches[2])?$matches[2]:“”;
$follow=false;
如果(''=$path){
$text=$host;
}elseif($\u服务器['HTTP\u主机]==$HOST){
$text=$path;
$follow=true;
}否则{
$text=$host.'/'.$path;
}
返回“”;
},
htmlspecialchars($string)
)
);
}

这取决于URL和安全的含义。“我没有时间测试像HTML Purify这样臃肿的反xss库。”。希望您使用的任何库都已经过测试,所以您可以简单地使用它们。为什么要重复工作并测试其他人的代码?你可以这样做。大多数博客都这样做。即使如此,它也表明你逃跑的方法是合理和充分的。URL中没有固有的不安全性。只要限制允许的url长度(@JohnP)我知道它无处不在,但我无法通过查看生成的html来判断它是如何做到的。即使我可以,它在任何地方都被使用并不意味着什么。博客每天都会被黑客攻击,这取决于你所说的url和安全。“我没有时间测试像HTML Purify这样臃肿的反xss库“。希望您使用的任何库都已经过测试,因此您可以简单地使用它们。为什么要重复工作并测试其他人的代码?您可以这样做。大多数博客都这样做。即使如此,它也表明您的转义方法是合理和充分的。url中没有固有的不安全性。只需限制允许的url长度即可。”(@JohnP我知道它无处不在,但我无法通过查看生成的html来判断它是如何做到的。即使我可以,它在任何地方都被使用这一事实并不意味着什么。博客每天都会遭到黑客攻击-1此函数有缺陷:
formatPost(
formatPost()alert(“XSS”)foo”)
@Gumbo:不,它不是:正如我在上一句中提到的,这个函数接受已经转义的输入(因为我将它用作树枝的
转义前过滤器)。我将我的帖子改为包含
htmlspecialchars
并删除了注释。-1这个函数有缺陷:
formatPost(alert(“XSS”)foo'))
@Gumbo:不,它不是:正如我在上一句中提到的,这个函数接受已经转义的输入(因为我使用它作为Twig的
转义前过滤器)。我将帖子改为包含
htmlspecialchars
,并删除了注释。
function formatPost($string) {
    return nl2br(
        preg_replace_callback(
            '~https?://([^/\s]+)(?:/((?>[/\w]+|\S(?!\s|$))*))?~',
            function($matches) {
                $url  = $matches[0];
                $host = $matches[1];
                $path = isset($matches[2]) ? $matches[2] : '';
                $follow = false;

                if ('' == $path) {
                    $text = $host;
                } elseif ($_SERVER['HTTP_HOST'] == $host) {
                    $text = $path;
                    $follow = true;
                } else {
                    $text = $host . '/' . $path;
                }

                return '<a href="' . $url . '"' . (!$follow ? ' rel="nofollow"' : '') . '>' . $text . '</a>';
            },
            htmlspecialchars($string)
        )
    );
}