【问题标题】:How I can sanitize my input values in node js?如何清理节点 js 中的输入值?
【发布时间】:2018-03-24 22:22:25
【问题描述】:

我验证了我的 Node.js 输入,以便它们不会为空,但我也想清理它们。请帮助我如何做到这一点。

req.checkBody('name', 'Name is required!').notEmpty();
req.checkBody('surname', 'Surname is required!').notEmpty();
req.checkBody('username', 'Username is required!').notEmpty();
req.checkBody('password', 'Password is required!').notEmpty();
req.checkBody('password2', 'Passwords do not match!').equals(req.body.password);

var errors = req.validationErrors();

if (errors) {
    res.render('user/register', {
        errors: errors,
        user: null,
        title: 'Register'
    });
}
else {
    var userData = {
        name : req.body.name,
        surname : req.body.surname,
        username : req.body.username,
        password : req.body.password,
        avatar : 'No_person.jpg'
    };
    userController.addUser(req,res,userData);
}

【问题讨论】:

标签: javascript node.js sanitization


【解决方案1】:
  • 对于大部分框架,可以使用sanitize节点模块:

     npm install sanitize --save
    

    然后可以使用like:

     var sanitizer = require('sanitize')();
    
     var name = sanitizer.value(req.name, 'string');
     var surname= sanitizer.value(req.surname, 'string');
    

    更多内容可以看sanitize文档

  • 如果您使用的是express,那么您可以使用express-validatorexpress-sanitize-input 包进行验证和清理,如下所示:

     const express = require('express');
     const { check } = require('express-validator');
     const app = express();
    
     app.use(express.json())
    
     app.post('/form', [
       check('name').isLength({ min: 3 }).trim().escape(),
       check('email').isEmail().normalizeEmail(),
       check('age').isNumeric().trim().escape()
     ], (req, res) => {
       const name  = req.body.name
       const email = req.body.email
       const age   = req.body.age
     })  
    

    更多信息可以通过express-validatorexpress-sanitize-input文档。

  • 如果您使用Hapi,则可以使用Joi 进行验证和清理,使用Joi,您可以使用其他选项清理变量

     validate(value, schema, {escapeHtml: true}, [callback])
    

    更多信息可以查看Joi文档。

  • 如果您不想使用任何第三方模块并想使用内置节点进行清理。您可以尝试以下操作:

     // For string variables
     str = typeof(str) === 'string' && str.trim().length > 0 ? str.trim() : '';
     // for boolean values
     bool = typeof(bool) === 'boolean' && bool === true ? true : false;
     // for array values
     arr = typeof(arr) === 'object' && arr instanceof Array ? arr : [];
     // for number values
     num = typeof(num) === 'number' && num % 1 === 0 ? num : 0;
     // for objects
     obj = typeof(obj) === 'object' && !(obj instanceof Array) && obj !== null ? obj : {};
    

【讨论】:

  • @V.Aleksanyan,这里string 指的是您要匹配的值或您要允许的正则表达式。您可以在sanitizer runkit 中尝试一下
  • 当我提交表单时,我会检查验证并编写您的代码 var name = sanitizer.value(req.body.name, 'string'); var name = sanitizer.value(req.body.surname, 'string'); var name = sanitizer.value(req.body.username, 'string');它返回给我这个错误“字符串不是有效的消毒剂类型”。请告诉我这是为什么?
  • 这只是一个例子来展示它是如何工作的,它应该是这样的var myMatchingString = sanitizer.value(req.mystring, /abc123/);或正则表达式而不是abc123,通过documentaion,它将解释如何使用带有应用程序的中间件
  • check() 不是 Express 内置的。它是express-validator的一部分
【解决方案2】:

其实我写了一个包来轻松解决这个问题。您可以在 Github 上使用它或为它做出贡献。

从这里下载这个包:https://www.npmjs.com/package/string-sanitizer

您可以使用此实用程序包对英语以外的外语进行消毒。在引擎盖下,这个库中使用了正则表达式。您可以将字符串转换为 URL 或文件名友好字符串。下面给出用例

var string = require("string-sanitizer");

string.sanitize("a.bc@d efg#h"); // abcdefgh
string.sanitize.keepSpace("a.bc@d efg#h"); // abcd efgh
string.sanitize.keepUnicode("a.bc@d efg#hক"); // abcd efghক
string.sanitize.addFullstop("a.bc@d efg#h"); // abcd.efgh
string.sanitize.addUnderscore("a.bc@d efg#h"); // abcd_efgh
string.sanitize.addDash("a.bc@d efg#h"); // abcd-efgh
string.sanitize.removeNumber("@abcd efgh123"); // abcdefgh
string.sanitize.keepNumber("@abcd efgh123"); // abcdefgh123
string.addFullstop("abcd efgh"); // abcd.efgh
string.addUnderscore("@abcd efgh"); // @abcd_efgh
string.addDash("@abcd efgh"); // @abcd-efgh
string.removeSpace("@abcd efgh"); // @abcdefgh

Codeblock

【讨论】:

  • 这个库更像是一个字符串操作库,而不是一个可行的消毒剂。卫生应该设法包含输入,最好是上下文感知,而不是仅仅将字符串操作到一些假设的期望结果:string.sanitize("1@2.com") 理想情况下不会返回"12com"。一些改进可能包括关注特定环境的卫生(sanitize.HTMLsafe()sanitize.SQLsafe()sanitize.EmailAddress() 等)以及删除字符串辅助函数(将厨房水槽留在家里)。
  • 感谢您的建议。基本上,我写它是为了解决一个实际问题。从那时起,许多人发现它很方便和有用。 “消毒剂”是指我们实际生活中的清洁或消毒。 “消毒剂”一词是在实际意义上使用的。而已。此外,名称 string-manipulator 和 string-manipulation 都已在发布此库时使用。我将来会尝试添加这些更新。再次感谢您。
【解决方案3】:

validator 每周有 500 万次下载,似乎是当今业界最受欢迎的软件包。 express-validator 使用 validator 作为它的核心。这些当然是一种选择,xsssanitize-html 等其他软件包也是如此

这两个验证器包都有大量文档,这里是关于清理的部分:

https://express-validator.github.io/docs/sanitization.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多