【问题标题】:Prevent node xss sanitizer on specific post requests在特定的帖子请求上防止节点 xss sanitizer
【发布时间】:2021-11-07 07:18:59
【问题描述】:

Context 是一个 node express api,我在我的主 server.js 文件上使用 xss-clean:

const xss = require('xss-clean');

// Prevent XSS attacks
app.use(xss());

问题:我想保存富文本,但在清理过程中被破坏了。

我想在全局范围内保留此功能,但是它阻止我通过前端的富文本编辑器(即tiptap-vue)保存富文本。使用编辑器保存的文本包含 html 标记,保存到数据库时会转义,当通过 get 请求推回前端时,文本会读取转义和元素的标记。

有没有办法阻止这个全局组件处理一个特定请求或请求中的特定数据?

或者有没有办法取消转义以便在前端使用?

【问题讨论】:

    标签: javascript node.js api express nuxt.js


    【解决方案1】:

    您可以简单地从您自己的 node_modules 文件夹中修改中间件,并在它开始解析请求对象的源代码文件中,您可以添加条件逻辑来检查请求对象是否满足您正在检查的条件-- 是特定请求还是请求中包含特定数据--然后决定是否对请求对象使用清理功能。

    [未修改] xss-clean/src/index.js:

    import { clean } from './xss'
    
    /**
     * export middleware
     * @return {function} Middleware function
    */
    module.exports = function () {
     return (req, res, next) => {
       if (req.body) req.body = clean(req.body)
       if (req.query) req.query = clean(req.query)
       if (req.params) req.params = clean(req.params)
    
       next()
     }
    }
    

    import { clean } from './xss'
    
    /**
     * export middleware
     * @return {function} Middleware function
    */
    module.exports = function () {
     return (req, res, next) => {
       if (req.url === "your route path") {
         //don't use clean() on request object OR you can store only the data you want 
         //in a temp variable to avoid getting sanitized, then sanitize the request 
         //object with clean(), and then replace that sanitized data with the data
         //in the temp variable OR as a new property in the req object
         const dataPoint = req.body.something.dataPoint;
         req.body = clean(req.body);
         req.body.something.dataPoint = dataPoint;
          
         return next();
       }
    
       if (req.body) req.body = clean(req.body)
       if (req.query) req.query = clean(req.query)
       if (req.params) req.params = clean(req.params)
    
       next()
     }
    }
    

    这有点老套,但确实可以。除非您确定这不会成为问题,否则不进行消毒是很危险的。您也可以简单地不在您的应用程序中全局使用此中间件,而仅在您希望此中间件清理的路由上使用它。

    【讨论】:

    • 我对更改库本身的担忧是,如果它更新,这些更改可能会丢失,可能我没有注意到。仅在路由上使用 xss-clean 的最佳实践(或体面)方法是什么?
    • 由于版本控制,您总是能够注意到它——前提是您使用了良好的版本控制标准。您还可以在 package.json 中固定模块的版本,这样它就不会自动将 npm 模块更新到最新版本。这应该不是问题,因为您没有在现有应用程序上进行全新的 npm 安装。
    • 我之前修改过节点模块。如果你真的知道你在做什么,这不是一个大问题。而且您始终可以使用版本控制恢复到稳定的分支/提交。但我同意,这是一种 hacky 方式,但在这种情况下,模块是如此简单和小,这不是什么大问题。您可以在自己的脚本文件中使用它们的包/API 创建自己的中间件。然后在要清理的路由中添加中间件功能。如果您不清楚如何执行此操作,我可以编辑我的答案以显示此内容。
    • 这实际上只是一个模型上的一个数据点,不需要进行清理。我能想到的解决方案的唯一替代方案似乎更脏,即删除全局 xss-clean 并在每条其他路线上实施,如果没有办法在 lib 本地执行它。我怎样才能找到合适的条件放置在您答案的“您的条件”区域?示例是帖子或放在“example.com/api/listings”或“example.com/api/listings/:slug”上
    • 如果您不打算将其用作特定于路由器的中间件,它会在特定于路由器的中间件和您的自定义逻辑之前对每条路由进行清理。因此,除非您想返回数据并将数据解析回您的喜好,否则您应该只修改包。只需添加检查 req.url 以查看它是否与该路由匹配的条件逻辑 > 获取该特定数据点将原始数据保存在临时变量中 > 在 req 对象的其余部分上运行 clean 方法,添加回原始数据返回其原始位置或作为 req obj 中的新属性。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2017-02-06
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多