在后端使用 DOMPurify 来清理表单数据的错误?

问题描述

我想知道是否可以在将表单保存到数据库之前使用 DOmpurify 来清理表单上的用户输入。以下是我在 routes.js 文件夹中为我的表单发布的内容

.post('/questionForm',(req,res,next) =>{
        console.log(req.body);
        /*console.log(req.headers);*/
        const questions = new QuestionForm({
            _id: mongoose.Types.ObjectId(),price: req.body.price,seats: req.body.seats,body_style: req.body.body_style,personality: req.body.personality,activity: req.body.activity,driving: req.body.driving,priority: req.body.priority
        });
        var qClean = DOmpurify.sanitize(questions);
        //res.redirect(200,path)({
        //    res: "Message recieved. Check for a response later."
        //});
        qClean.save()
        .then(result => {
            //res.redirect(200,'/path')({
            //    //res: "Message recieved. Check for a response later."
            //});
            res.status(200).json({
                docs:[questions]
            });
        })
        .catch(err => {
            console.log(err);
        });
    });

我也在页面顶部用

导入了包
import DOmpurify from 'dompurify'; 

当我运行服务器并提交发布请求时,它抛出 500 错误并声称 dompurify.sanitize 不是函数。我是否在错误的地方使用它,和/或在后端使用它甚至是正确的?

解决方法

这可能有点晚了,但对于像我这样碰巧遇到这个用例的其他人,我找到了一个到目前为止似乎非常适合的 npm 包。它被称为同构-dompurify。

isomorphic-dompurify

DOMPurify 需要一个 DOM 来与之交互;通常由浏览器提供。 Isomorphic-dompurify 提供 DOMPurify 另一个包“jsdom”,作为一个依赖项,就像一个补充的虚拟 DOM,所以 DOMPurify 知道如何清理你的输入服务器端。

用包自己的话来说“DOMPurify 需要一个 DOM 树作为基础,默认情况下在 Node 中不可用。为了在服务器端工作,我们需要创建一个假 DOM 并提供给 DOMPurify。这​​意味着服务器端的 DOMPurify 初始化逻辑与客户端不同”。