我有一个Express应用程序,我想要防止XSS.
我更新了一些关于XSS的页面 – 包括OWASP个页面,鉴于我的应用程序特性,我决定在我使用之前编写一个编码HTML实体的中间件 – 更准确地说是XML实体,包括<>“’ – 我的请求参数他们在路线上.
我还在连接时刷新会话cookie,以防止cookie被盗.
我如何构建我的应用程序
>所有AJAX请求都是POST(所有参数都由中间件重写)
>我不使用GET参数
>我使用的路径参数应该是int,当它们不是时我会引发错误.
>唯一不是来自用户输入的数据来自OAuth个人数据检索,当我们进入我的应用程序时,我也会对其进行清理
>在页面加载时执行的客户端JS仅涉及来自数据库的数据,假设中间件在进入数据库时进行了清理.
> window.location安全使用
>我还没有使用任何外部客户端JS库(如JQuery或FileUpload) – 也许我稍后会在代码中添加它们
>当用户输入内容时,它总是被发送到服务器(通过AJAX POST),我借此机会发回已清理的输入以在JS和/或DOM中使用它而不是初始输入
>我不使用eval
我的感觉
我得出结论,使用这种行为(清理外部数据)我避免了所有存储和反映的XSS,正确使用windows.location可以防止我对基于DOM的XSS.
这个结论是对的,还是我忘记了什么?我还应该使用一些helmet功能吗?
编辑
我的问题不是什么是最好的HTML清理服务器端(即使它是它的一部分),我宁愿要知道全局是否我在我的代码中保护我的应用程序保护我的应用程序免受所有众所周知的类型的XSS.特别是我会知道我的中间件是不是一个坏习惯.
实际上,XSS filtering function in PHP至少没有涵盖基于DOM的XSS攻击(因为它仅涵盖服务器端的HTML清理).
我列出了我的应用程序的一些特性,以便对我忘记的任何一点或者将应用程序暴露给XSS漏洞的糟糕架构模式提供反馈.
编辑2
我选择Erlend的答案是最好的,但msoliman的答案也很出色,并且是Erlend答案的补充.