如何从express-validators的escape()函数中排除特定字符

6

我正在使用express-validator的check函数验证用户输入,想知道是否可以排除某些字符进行测试?

check("profile.about").trim().escape()

该方法将HTML中使用的任何字符转换为它们对应的HTML实体,但是如果用户输入撇号,它会导致不良结果。是否有过滤撇号的方法可以在escape() 方法中使用?如果没有,有人有什么提示可以模仿 escape() 并且把 ' 删除吗?


这是一个奇怪的问题。因为允许使用撇号将使您暴露于SQL注入和跨站点脚本攻击之中。这将使转义变得毫无用处。 - yonBav
你为什么想要保留撇号? - yonBav
1
我无法确定这是否会成为一个问题,这很大程度上取决于您如何实现服务器。无论如何,我建议在将值返回给用户之前使用unescape。 - yonBav
1
请查看此链接 https://flaviocopes.com/express-sanitize-input/ - yonBav
在进入数据库之前进行转义,然后在添加到DOM之前进行反转义?这样做不会允许HTML被添加到DOM中吗?感谢帮助,我正在逐渐习惯这个方面。 - PumpkinBreath
显示剩余2条评论
1个回答

4

可以立即添加另一个中间件来完成这个操作...

unescape-middleware.js

module.exports = (escaped, char) => function (req, res, next) {
    unescapeCharacter(req.params, escaped, char);
    unescapeCharacter(req.query, escaped, char);
    unescapeCharacter(req.body, escaped, char);
    return next();
}

function unescapeCharacter (obj, escaped, char) {
    for (const key in obj) {
        // Replace the escaped version with the character
        obj[key] = obj[key].replace(new Regex(escaped, "g"), char);
    }
}

这段代码就像这样使用... app.js
const { check } = require("express-validator");
const unescape = require("./path/to/unescape/middleware.js");

app.get(
    "/some/route", 
    check("profile.about").trim().escape(), 
    unescape("'", "'"), 
    require("./path/to/router/handler.js")
);

我相信这应该解决了这个问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接