我听到大家都说输出编码必须在客户端而不是服务器端完成。我的问题是:它是否因环境而异?
encodeURIComponent
这样的客户端js函数来编码导致XSS的url,攻击者如何绕过这个并仍然导致XSS?答案 0 :(得分:2)
简短的回答是XSS编码需要在将数据放入html或javascript(服务器端和/或客户端)的情况下进行。我可以很容易地想象在服务器端放入脚本标记的数据开始正确编码,但是客户端的javascript正以不安全的方式使用该值,从而产生了XSS漏洞。
因此,当将不受信任的数据放入网页(无论是在html标签中,在-tags内,在css中等等 - 请参阅OWASP XSS预防备忘单)时,我们需要进行编码。然后,当我们来到客户端时,我们还需要确保我们的javascript不会引入XSS问题。例如,这可以是基于DOM的XSS,或上面提到的例子。
所以我的答案是,你需要在服务器和客户端进行编码。
我不明白第三个问题是如何相关的。网络钓鱼可能以多种不同的方式发生。在一个完全不同的域上,只是模仿原始页面等。
编辑:还有一件事。如果在没有编码的情况下将不受信任的数据放入页面服务器端,则客户端可以做很少的事情来解决这个问题。它很可能已经很晚了。
答案 1 :(得分:1)
Erlend的答案很美。我想分享一下有关输出编码的发现。
在服务器端完成的输出编码比在客户端更好。
您可以从OWASP Xss Prevention
获得有关输出编码的更多知识你也可以做这个客户端。如果您要在html上下文中使用不受信任(用户给定的输入)数据,请使用javascript的原生api innerText IE Docs(moz的textContent)或编码字符(<,>,',“,/ ,)进入html实体