2011-03-19 64 views
1

我想将用户评论中的网址转化为链接。将网址转换为链接安全吗?

我没有时间测试像HTML Purify这样的臃肿的反xss库,所以我不会允许任何html标记。

我只想通过htmlentities()和nl2br()完成所有事情,然后使用preg_replace()来查找URL并将它们变为链接('a'html tags)。

抓住我找到的网址并将它们放入href =''里面是不安全的吗?

如果不是,我该怎么办呢?

+4

这取决于你的意思是通过网址和安全。 – Gumbo 2011-03-19 09:22:14

+0

“我没有时间去测试像HTML Purify这样的臃肿的反xss库”。希望你使用的任何库都已经过测试,所以你可以简单地使用它们。为什么要重复努力并测试别人的代码? – 2011-03-19 09:22:40

+1

你可以这样做。大多数博客都这样做。即使这样做 – JohnP 2011-03-19 09:22:57

回答

1

是的,它应该是安全的。如果你想知道如何,这里是我使用这个功能(我简化它为这篇文章的目的):

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) 
     ) 
    ); 
} 
+1

-1这个函数是有缺陷的:'formatPost('http://“> foo')' – Gumbo 2011-03-19 10:30:36

+1

@Gumbo:不,它不是:正如我在最后一句中提到的,这个函数接受已经转义的输入(因为我用它作为Twig的'pre_escape'过滤器)。我改变了我的帖子以包含'htmlspecialchars'并删除了注释。 – NikiC 2011-03-19 10:37:23

+1

哦,你是对的,必须跳过它。 – Gumbo 2011-03-19 10:48:44