这是我的功能:
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清理功能)?
答案 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:
- 就像“网址”一样。