2

我听到每个人都说输出编码必须在客户端而不是服务器端完成。我的问题是:它不随上下文而变化吗?

  1. 是否存在客户端输出编码足够好且无法绕过的情况?
  2. 如果我使用客户端 js 函数encodeURIComponent来编码导致 XSS 的 url,攻击者如何绕过这个并仍然导致 XSS?
  3. 网络钓鱼也可能由于 XSS 而发生。如果我至少进行输出编码可以防止网络钓鱼吗?
4

2 回答 2

2

简短的回答是,XSS 编码需要在数据被放入 html 或 javascript 的地方进行,无论是服务器端和/或客户端。我可以很容易地想象放入服务器端脚本标记的数据开始正确编码,但随后客户端的 javascript 以不安全的方式使用该值,从而产生 XSS 漏洞。

因此,当将不受信任的数据放入网页时(无论是在 html 标签中、在 -tags 中、在 css 中等 - 请参阅 OWASP XSS 预防备忘单),我们需要进行编码。然后当我们来到客户端时,我们还需要确保我们的 javascript 不会引入 XSS 问题。例如,这可能是基于 DOM 的 XSS,或者上面提到的示例。

所以我的回答是,你需要在服务器端和客户端都进行编码。

我不明白第三个问题是如何相关的。网络钓鱼可能以多种不同的方式发生。在一个完全不同的域上,只是模仿原始页面等。

编辑:还有一件事。如果将不受信任的数据放入页面服务器端而不进行编码,则客户端几乎无法解决该问题。很可能已经为时已晚。

于 2012-02-11T20:56:27.890 回答
1

Erlend的答案很漂亮。我想分享我关于输出编码的发现。

在服务器端完成的输出编码比在客户端更好。

您可以从 OWASP Xss Prevention获得有关输出编码的更多知识

你也可以做这个客户端。如果您要在 html 上下文中使用不受信任的(用户给定的输入)数据,请使用 javascript 的原生 api innerText IE Docs(对于 moz 的 textContent)或将字符(<、>、'、、/、)编码为 html 实体

于 2014-02-18T06:08:51.083 回答