2011-03-19 110 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