这是我的功能:
function is_url($url) {
return (preg_match('#^(https?):\/\/#i', $url) && (filter_var($url, FILTER_VALIDATE_URL) !== FALSE));
}
这是一个很好的 url,它验证为 true:
http://blah.com"onclick="alert(document.cookie)
想象一下,如果这进入<a href="<?php echo $url; ?>">
是否有更好的正则表达式 URL 验证器?或者我正在测试的 URL 实际上是一个有效的 URL(在这种情况下我需要 XSS 清理功能)?
最佳答案
有这个内置的 filter :
filter_var($url, FILTER_VALIDATE_URL);
这将返回 false
以及您的示例 URL。如果有效,它将返回$url
。示例:
glopes@nebm:~$ php -r "var_dump(filter_var('http://blah.com\"onclick=\"alert(document.cookie)', FILTER_VALIDATE_URL));" bool(false)
Anyway, the solution to prevent XSS is to use htmlspecialchars
. Since it's an attribute, you should use ENT_QUOTES
:
htmlspecialchars($data, ENT_QUOTES);
但是您还应该验证 URL,否则用户可能会包含 javascript:
之类的“URL”。
关于PHP filter_var 用于防止 XSS 攻击的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3254512/