PHP filter_var用于针对XSS攻击的URL

时间:2010-07-15 10:06:15

标签: php xss

这是我的功能:

function is_url($url) {
    return (preg_match('#^(https?):\/\/#i', $url) && (filter_var($url, FILTER_VALIDATE_URL) !== FALSE));
}

这是一个很好的网址,它验证为真:

http://blah.com"onclick="alert(document.cookie)

想象一下,如果进入<a href="<?php echo $url; ?>">

是否有更好的URL验证程序与正则表达式?或者我正在测试的URL实际上是一个有效的URL(在这种情况下,我需要一个XSS清理功能)?

1 个答案:

答案 0 :(得分:2)

这是内置的filter

filter_var($url, FILTER_VALIDATE_URL);

这将使用您的示例网址返回false。如果它有效,它将返回$url。例如:

glopes@nebm:~$ php -r "var_dump(filter_var('http://blah.com\"onclick=\"alert(document.cookie)', FILTER_VALIDATE_URL));"
bool(false)

无论如何,防止XSS的解决方案是使用htmlspecialchars。由于它是属性,因此您应该使用ENT_QUOTES

htmlspecialchars($data, ENT_QUOTES);

但是您还应该验证网址,因为否则用户可以包含javascript: - 就像“网址”一样。