2015-02-17 51 views
1

場景:支持內容中超鏈接的應用程序。該應用程序具有代碼來執行,看起來像這樣的超級鏈接:如何區分超鏈接和本地執行的任何東西?

Process.Start(href); // href is the link, e.g. "http://www.google.com" 

問題:用戶可以設置該字符串中的任意內容和應用程序需要消毒,並禁止非網址,如「foo.exe的「這可能是本地命令或可執行文件。什麼是「正確」的方式來做到這一點?注意:我們是而不是試圖做http黑名單。

到目前爲止,我們正在考慮將其解析爲System.Uri,並檢查是否存在非空的uri Scheme,例如, HTTP://。但是,由於這是一個潛在的安全問題(用戶使用url創建文檔並將文檔發送給點擊該URL的其他人),我們想知道安全專家建議的內容。例如,具有file://方案的url也可能有問題。

編輯:這是我認爲任何支持超鏈接的應用程序(瀏覽器,文字處理器,編輯器等)必須處理的。我很想知道標準行爲是什麼。

回答

2

有一個基本的方法:

try{var url = new Uri(mightBeScary);} 
catch {/*oh snap it's not a URL, run!*/} 

當然,這仍然可以允許這樣的事情:

ftp://how-to-spell-malicious-plx.com/virus.exe 

所以,正則表達式,以確保它實際上是一個HTTP URL會成爲下一個合理的步驟。無恥地被盜,但由於從this wonderful person

private bool IsUrlValid(string url) 
{ 

    string pattern = @"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$"; 
    Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    return reg.IsMatch(url); 
} 

最徹底的辦法,以確定什麼是有效的URL是發出一個HEAD請求所證實here

這將發出請求並查看某個內容是否實際上是一個URL並且具有Web端點。然後您可以根據此確定進行分支。

相關問題