在Hapi Joi/Express应用程序中验证和消毒输入之间的区别是什么?

cra*_*aft 7 security node.js express hapijs joi

使用Hapi.JS Joi验证Express应用程序的输入.这是一个样板设置:

const Joi = require('joi');

const schema = Joi.object().keys({
   username: Joi.string().alphanum().min(3).max(30).required(),
   birthyear: Joi.number().integer().min(1900).max(2013),
}).with('username', 'birthyear');

app.use('/user/:id', function (req, res, next) {

      Joi.validate({ username: 'abc', birthyear: 1994 }, schema, function 
      (err, value) { 
        if (err){

        ...

        }

        ...
        next()
        }
      });
   })
Run Code Online (Sandbox Code Playgroud)

问题#1:验证和消毒之间有什么区别?我应该清理Express API的输入吗?这是一个移动应用程序,而不是一个网站,所以我试图了解我是否应该验证以及消毒.

问题#2 如何使用Joi或其他Express兼容库清理输入?

Rid*_*ara 6

验证和消毒之间有什么区别?

消毒

清理输入意味着在将输入存储在数据库中或将其用于其他目的以防止恶意代码注入之前对其进行检查。

一个基本的示例是SQL注入,如果您要存储/验证数据,则要考虑到这一点。假设您正在测试用户在数据库中提交的登录凭据。您的查询可能类似于

SELECT * FROM `users` WHERE `username`='$user' AND `pass`='$pass'
Run Code Online (Sandbox Code Playgroud)

其中$ user和$ pass是用户输入的用户名和密码。

如果您不清除用户输入的内容,并且用户输入如下内容:

username -> admin' AND 1=1 OR 1='1
password -> pass
Run Code Online (Sandbox Code Playgroud)

您的查询将变为:

SELECT * FROM `users` WHERE `username`='admin' AND 1=1 OR 1='1' AND `pass`='pass'
Run Code Online (Sandbox Code Playgroud)

执行时选择admin字段并以admin用户身份登录。

但是,如果要清理用户输入,则查询将是:

SELECT * FROM `users` WHERE `username`='admin\' AND 1=1 OR 1=\'1' AND `pass`='pass'
Run Code Online (Sandbox Code Playgroud)

除非或除非用户名和密码与数据库条目匹配,否则用户将无法访问任何帐户。

验证方式

验证是对任何传入数据的检查或验证,这有助于验证数据在传输过程中没有受到破坏或破坏。

就像您将移动平台作为参数一样,您只希望允许Android或IOS作为值,而其他值无效。如果需要用户输入一些关键值,这些值不能为空,则对其进行验证。

但是,如果用户ANDROID & IOS输入n次,则进行消毒ANDROID & IOS。不允许用户破坏代码和逻辑

我应该清理Express API的输入吗?

是的,您应该始终清除数据,就像将其作为其余API公开一样,然后用户可以将恶意数据插入到移动应用程序的输入中。为所有边缘情况做好准备,用户可以做任何事情会更好。(:眨眼:)

如何使用Joi或其他兼容Express的库清理输入?

使用Joi,您可以使用附加选项对变量进行消毒

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