我正在帮助为开发人员(其中约 100 人)提供一小时的跨站点脚本培训。您认为哪些概念对于理解它们是必不可少的?现在我们有:
- 反射和存储的区别
- 防御层(WAF、浏览器防御、服务器标头和安全编码)
- 安全编码和编码参数的上下文
最重要的是,漏洞的潜在影响。
我正在帮助为开发人员(其中约 100 人)提供一小时的跨站点脚本培训。您认为哪些概念对于理解它们是必不可少的?现在我们有:
最重要的是,漏洞的潜在影响。
从开发人员的角度来看,您拥有的前两点并不是很相关。存储型和反射型 XSS 具有相同的缓解措施:根据上下文正确转义您输出的内容。层层防御可能只会被视为实施不力的缓解措施的借口:“WAF 会为我捕获它。”
相反,请关注以下代码卫生实践:
jsstringsafeEmail
、htmlattrsafeColor
、htmltextsafeFullName
等。您认为哪些概念对于理解它们是必不可少的?
还有什么?您的清单中缺少的一件大事是:有很多工具和技术都可以用来减轻这些潜在的漏洞;深度防御建议我们尽可能多地使用它们。
您涵盖了大部分基础知识。扩展一点你的观点(其中一些对这里的大多数读者来说似乎很明显,但对所有开发人员来说可能不一定很明显):
但我认为最重要的一点是:HTML 编码应该默认发生,通过使用默认编码所有参数的模板引擎。
如果编码发生在所有地方,很容易忘记一次。当然,处理 HTML 编码不够用的所有情况仍然很重要,但大多数 XSS 漏洞将通过默认编码来阻止。
我认为要教的两个最重要的教训是:
关于我的第一点:几乎所有的注入问题都源于在错误的抽象级别上工作:程序员在他们应该使用从正确的做事方式抽象出来的高级操作的情况下连接字符串。这意味着:
关于第二点:关于依赖输入端过滤的危险的一个很好的教训是浏览 OWASP 的XSS Filter Evasion Cheat Sheet 。将该页面视为记录一次又一次失败的尝试,以及通过输入端过滤解决 XSS 的一次又一次尝试,以及攻击者能够用来绕过它的聪明才智。
您还经常看到很多关于“不可信”输入以及如何处理它们的建议,这充满了危险,因为:
OWASP 的XSS 预防备忘单是另一个非常出色的文档,它遵循我的两点。它侧重于如何安全地将任意字符串插入到动态生成的 HTML、CSS 和 Javascript 文档中。如果您在一个地方(在第三方库或您的代码库中)解决该问题并始终一致地应用该解决方案,那么您将做得很好——您将“切断”XSS 漏洞的“颈部”。