Node.js 针对XSS保护Express:对整个传入请求的HTML实体进行编码就足够了吗?
我有一个Express应用程序,我想保护它免受XSS攻击 我更新了一些关于XSS的页面,包括一些页面,鉴于我的应用程序特点,我决定编写一个中间件,在路由中使用请求参数之前,对HTML实体(更准确地说是XML实体,包括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
“
)进行编码
我还在连接时刷新会话cookie,以防止cookie被盗
我如何构建我的应用程序
- 所有AJAX请求都是POST(所有参数都由中间件重写)
- 我不使用GET参数
- 我使用的routes参数应该是int,当它们不是int时,我会引发一个错误
- 唯一不来自用户输入的数据来自OAuth个人数据检索,当它们进入我的应用程序时,我也会对其进行清理
- 在页面加载时执行的客户端JS只涉及来自数据库的数据,假设这些数据在进入数据库时由中间件进行清理
- 窗口位置是安全使用的
- 我还没有使用任何外部客户端JS库(如JQuery或FileUpload)——也许我会在代码中添加它们
- 当用户输入某个内容时,它总是被发送到服务器(通过ajaxpost),我借此机会将经过净化的输入发送回JS和/或DOM中,而不是初始输入
- 我不用eval
<> P>我选择Erlend的答案是最好的,但是MSOLIMMAN的一个也很好,和Erlend的答案是互补的。 < P>你在这里做得很好,我认为你应该考虑:逃避数据以避免XSS需要上下文相关。OWASP XSS预防作弊表详细解释。 IMHO,从客户端接收数据时,您应该确保数据根据域是有效的。这就是您使用路由参数所做的。您希望它是int,如果不是,则拒绝。对于其他数据类型,您也应该这样做。这是有效的名字吗?(名字通常不包含<或>)。这是有效的邮政编码吗?这将阻止许多攻击,因为攻击通常包含在给定上下文中无效的字符 当涉及到停止攻击时,XSS、SQL注入等都是同一问题的子类。在将数据添加到HTML(或XML或SQL查询等)时,必须对数据进行转义,并且需要对给定上下文进行转义。如何转义数据取决于数据是否在标记之间,作为属性值,在CSS等中 通过尝试在输入的过程中对数据进行清理,您可能会发现您的清理功能不够好,并且您有部分/错误地清理了数据,这将是一个需要修复的混乱局面 总结: a) 根据进入过程中的域进行验证和拒绝
b) 在输出期间执行基于上下文的转义您可以在客户端清理html 此外,您还可以按照以下线程检查如何在服务器端执行操作,以获得更好的安全性
可能与True重复,它使用PHP而不是node.js,但它传达了基本思想。