Node.js 针对XSS保护Express:对整个传入请求的HTML实体进行编码就足够了吗?

Node.js 针对XSS保护Express:对整个传入请求的HTML实体进行编码就足够了吗?,node.js,express,xss,sanitize,Node.js,Express,Xss,Sanitize,我有一个Express应用程序,我想保护它免受XSS攻击 我更新了一些关于XSS的页面,包括一些页面,鉴于我的应用程序特点,我决定编写一个中间件,在路由中使用请求参数之前,对HTML实体(更准确地说是XML实体,包括“)进行编码 我还在连接时刷新会话cookie,以防止cookie被盗 我如何构建我的应用程序 所有AJAX请求都是POST(所有参数都由中间件重写) 我不使用GET参数 我使用的routes参数应该是int,当它们不是int时,我会引发一个错误 唯一不来自用户输入的数据来自OAu

我有一个Express应用程序,我想保护它免受XSS攻击

我更新了一些关于XSS的页面,包括一些页面,鉴于我的应用程序特点,我决定编写一个中间件,在路由中使用请求参数之前,对HTML实体(更准确地说是XML实体,包括
)进行编码

我还在连接时刷新会话cookie,以防止cookie被盗

我如何构建我的应用程序

  • 所有AJAX请求都是POST(所有参数都由中间件重写)
  • 我不使用GET参数
  • 我使用的routes参数应该是int,当它们不是int时,我会引发一个错误
  • 唯一不来自用户输入的数据来自OAuth个人数据检索,当它们进入我的应用程序时,我也会对其进行清理
  • 在页面加载时执行的客户端JS只涉及来自数据库的数据,假设这些数据在进入数据库时由中间件进行清理
  • 窗口位置是安全使用的
  • 我还没有使用任何外部客户端JS库(如JQuery或FileUpload)——也许我会在代码中添加它们
  • 当用户输入某个内容时,它总是被发送到服务器(通过ajaxpost),我借此机会将经过净化的输入发送回JS和/或DOM中,而不是初始输入
  • 我不用eval
我的感觉

我的结论是,通过这种行为(在外部数据出现时对其进行清理),我避免了所有存储和反射的XSS,并且正确使用windows.location可以防止我使用基于DOM的XSS

这个结论是对的,还是我忘记了什么?我应该也使用一些函数吗

编辑

我的问题不是什么是最好的HTML消毒器服务器端(即使它是它的一部分),而是想知道我在代码中设置的保护是否在全球范围内保护我的应用程序免受所有已知类型的XS攻击。特别是,我想知道我的中间件是否是一种不好的做法

实际上,它至少不包括基于DOM的XSS攻击(因为它只包括服务器端HTML清理)

我列出了我的应用程序的一些特殊性,以便对我忘记的任何一点或可能使应用程序暴露于XSS漏洞的糟糕架构模式进行反馈

编辑2


<> P>我选择Erlend的答案是最好的,但是MSOLIMMAN的一个也很好,和Erlend的答案是互补的。

< P>你在这里做得很好,我认为你应该考虑:逃避数据以避免XSS需要上下文相关。OWASP XSS预防作弊表详细解释。 IMHO,从客户端接收数据时,您应该确保数据根据域是有效的。这就是您使用路由参数所做的。您希望它是int,如果不是,则拒绝。对于其他数据类型,您也应该这样做。这是有效的名字吗?(名字通常不包含<或>)。这是有效的邮政编码吗?这将阻止许多攻击,因为攻击通常包含在给定上下文中无效的字符

当涉及到停止攻击时,XSS、SQL注入等都是同一问题的子类。在将数据添加到HTML(或XML或SQL查询等)时,必须对数据进行转义,并且需要对给定上下文进行转义。如何转义数据取决于数据是否在标记之间,作为属性值,在CSS等中

通过尝试在输入的过程中对数据进行清理,您可能会发现您的清理功能不够好,并且您有部分/错误地清理了数据,这将是一个需要修复的混乱局面

总结:

a) 根据进入过程中的域进行验证和拒绝


b) 在输出期间执行基于上下文的转义

您可以在客户端清理html

此外,您还可以按照以下线程检查如何在服务器端执行操作,以获得更好的安全性


可能与True重复,它使用PHP而不是node.js,但它传达了基本思想。