假设我有一个 Web 应用程序,用户可以在其中在其个人资料中附加一个链接以显示头像(在 img 标签之后显示)。
这安全吗?我认为不是。
检查提供的网址是否为真实图片的最佳方法是什么?还有其他解决方案吗?(现在我不想上传)。
不,这不安全。这种方法容易受到 XSS(跨站点脚本)和 CSRF(跨站点请求伪造)攻击。img
使用标签构建可能的 XSS 攻击的方法数量很多。看看 OWASP list Malformed img tags只是为了给你一个想法。
你可能会说逃避可以帮助你。是的,但是单独逃避并不能保证 XSS 的预防。以下是 OWASP(开放 Web 应用程序安全项目)的一般建议:
您必须对要放入不受信任数据的 HTML 文档部分使用转义语法
加上检查哪些数据是允许的(白名单),而不是检查无限的不允许数据列表。这是 OWASP 的XSS 预防备忘单。OWASP 还发布了一个ESAPI
用于在正确上下文中转义的库。
但是假设你已经完成了 XSS。使用 CSRF,恶意用户可以在您的img
标签内构造合法请求以更新某些用户的个人资料。假设这样的用户来看这个个人资料,突然他/她的个人资料被更新了!在这种情况下,您可能需要生成与用户会话关联的“挑战”/验证令牌,该令牌将附加到每个用户的请求中。
我的建议是要么使用像 gravatar 这样的外部可信服务,要么实现上传。如果您确实想使用用户的输入,那么我强烈建议您熟悉此案例的 ESAPI 库以及 OWASP XSS 和 CSRF 预防备忘单。
如果你使用 urlEncode() + urlDecode() 没问题