<?PHP
//fetch website data from db..
$website=htmlentities("javascript:alert()");
?>
<a href="<?PHP echo $website;?>">Click me</a>//without http will get attack
<a href="http://<?PHP echo $website;?>">Click me</a>
我有一个Web应用程序,为用户添加他们的网站提供输入。
然而我考虑安全问题,我做了测试。如果我添加http://它将不会运行javascript。我的问题是我还需要做什么来保护href安全吗?
$url="example.php?name=Peter&age=37";
if(!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)){echo "URL is not valid";}
else{echo "URL is valid";}
我使用了validate_url,但是这个返回无效。从W3例子来看,W3显示输出有效
答案 0 :(得分:1)
要通过锚href
属性阻止XSS,您需要做三件事:
您已经在执行上面的前两个(尽管htmlspecialchars
应优先于htmlentities
用于此目的),因此您只需要处理(3)。一种方法是在URL前面强制http://
,但这会破坏使用不同协议的任何URL(例如HTTPS)。
更好的解决方案是使用允许协议的白名单,例如:
$allowed = [null, 'http', 'https']; // null = not specified
$scheme = parse_url($website, PHP_URL_SCHEME);
if ($scheme === false) {
// seriously malformed URL, what to do?
}
else if (!in_array($scheme, $allowed, true)) {
// protocol not allowed, don't display the link!
}
else {
// everything OK
}