【问题标题】:href security, prevent xss attackhref安全,防止xss攻击
【发布时间】:2013-09-27 17:39:29
【问题描述】:
<?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>

我有一个网络应用程序为用户提供输入以添加他们的网站。

但是我考虑到安全问题,我做了测试。如果我添加了 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 显示输出有效

【问题讨论】:

  • 您应该在将其存储到数据库之前检查网站

标签: javascript xss


【解决方案1】:

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

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

你已经在做上面的前两个了(虽然htmlspecialchars应该优先于htmlentities),所以你只需要注意(3)。一种方法是在 URL 前面强制使用 http://,但这会破坏任何使用不同协议(例如 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
}

【讨论】:

  • 我对 http 到 https 进行了测试,我输入 http:// "www.google.com" 它会自动更改为 https,但是我不确定 ftp 等其他的。
  • @BenWong:它不会自动更改; Google 会将您重定向到他们的安全服务。如果他们没有为您的方便进行设置,那它根本就行不通。
  • 这是一个棘手的问题,因为大多数用户不输入协议,他们只输入 www
  • @BenWong:由您决定什么是可接受的,什么是不可接受的。 null 处理“未指定协议”的情况。另外,请记住,用户也可以直接从地址栏复制粘贴。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多