1
<?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 显示输出有效

4

1 回答 1

3

要通过锚href属性防止 XSS,您需要做三件事:

  1. 将值放在引号内
  2. 编码任何具有特殊含义的字符
  3. 确保将 URL 的协议列入白名单(如果存在)

你已经在做上面的前两个(尽管htmlspecialchars应该优先htmlentities于这个目的),所以你只需要照顾(3)。一种方法是http://在 URL 前进行暴力破解,但这会破坏任何使用不同协议(例如 HTTPS)的 URL。

更好的解决方案是使用允许协议的白名单,例如:

$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
}
于 2013-09-27T09:39:29.260 回答