过滤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
相反!使用正则表达式,你可以使用parse_url
并检查方案为空或http
之一,https
和ftp
:
$components = parse_url($url);
if (!isset($url['scheme']) || in_array(strtolower($url['scheme']), array('http', 'https', 'ftp'))) {
// valid
} else {
// invalid
}
另见: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的更多信息。
谢谢,我将使用hrtmlentities在将它放入属性之前正确地转义数据。我不确定应该使用urlencode()吗? – John 2011-05-03 07:50:00
我会在每个削减段上使用urlencode()来保证安全。这绝对是值得写出一个功能,一些真正坚实和偏执的东西。 – 2011-05-03 10:09:18
你究竟想要做什么,你想要保护什么? – 2011-05-02 10:23:47
XSS,我试图过滤网址,以进入 John 2011-05-02 10:26:40