过滤URL输出PHP

问题描述:

确保网址如 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

相反!使用正则表达式,你可以使用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

另见: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