2011-05-02 59 views
1

確保網址如 javascript:alert('a'); 和VBScript一些變體等,沒有被列入白名單https?|ftp That's easy enough: ^(?:https?|ftp):// 允許的,但我怎麼能允許相對URL呢? 如../../../blah和./blah也是/images/img.png過濾URL輸出PHP

換句話說就是使用^(?:(?:https?|ftp)://|[./])安全嗎?

我問周圍和可能的解決方案是: parse_url

如果方案或方案== http或方案== HTTPS或方案== FTP或方案==至mailto

+0

你究竟想要做什麼,你想要保護什麼? – 2011-05-02 10:23:47

+0

XSS,我試圖過濾網址,以進入 John 2011-05-02 10:26:40

回答

1

相反!使用正則表達式,你可以使用parse_url並檢查方案爲空或http之一,httpsftp

$components = parse_url($url); 
if (!isset($url['scheme']) || in_array(strtolower($url['scheme']), array('http', 'https', 'ftp'))) { 
    // valid 
} else { 
    // invalid 
} 
+0

是的,我在5分鐘前添加了這個問題。 :) – John 2011-05-02 10:42:56

+0

@John:我沒有注意到。 :) – Gumbo 2011-05-02 11:07:45

1

另見:Sanitizing strings to make them URL and filename safe?

我想過濾的網址,例如去 到<a href=""<img src=""

要小心,因爲它可能只是一個屬性的「突圍」 「以正則表達式開始」。例如,我公司可提供http://safeurl.com" onclick="alert('xss attack'),當插入到你的屬性,你會:

<a href="http://safeurl.com" onclick="alert('xss attack')"> 

確保urlencode()價值以及你在做任何其他的安全性。

我可能會考慮反對允許../../relative/urls或可能使用parse_url作爲Gumbo已建議。

查看關於OWASP.org的更多信息。

+0

謝謝,我將使用hrtmlentities在將它放入屬性之前正確地轉義數據。我不確定應該使用urlencode()嗎? – John 2011-05-03 07:50:00

+0

我會在每個削減段上使用urlencode()來保證安全。這絕對是值得寫出一個功能,一些真正堅實和偏執的東西。 – 2011-05-03 10:09:18