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

时间:2018-01-26 16:28:45

标签: node.js security 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()
        }
      });
   })

问题#1 :验证和消毒之间的区别是什么?  我应该清理Express API的输入吗? 它适用于移动应用,而非网站,所以我试图了解我是否应该验证以及消毒。

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

3 个答案:

答案 0 :(得分:4)

清理用于防止恶意代码

XSS清理<script>alert(1)</script>的示例 已更改为&lt;script&gt;alert(1)&lt;/script&gt; 这样它就会显示在浏览器上而不会执行

验证用于一般检查,例如输入是否是有效的电子邮件,电话号码等

示例电子邮件验证,
长度> 5,@应该出现,.之后应该出现@

更新问题2

清理用户的所有输入是一种非常好的做法。
一个要记住的伟大规则 绝不相信用户的数据。

答案 1 :(得分:4)

  

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

<强>消毒

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

一个基本的例子是SQL注入,如果你想存储/验证数据,它将被考虑在内。假设您正在测试用户在数据库中提交的登录凭据。您的查询可能类似于

SELECT * FROM `users` WHERE `username`='$user' AND `pass`='$pass'

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

如果您没有清理用户输入,用户输入如下内容:

username -> admin' AND 1=1 OR 1='1
password -> pass

您的查询将变为:

SELECT * FROM `users` WHERE `username`='admin' AND 1=1 OR 1='1' AND `pass`='pass'

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

但是如果您正在清理用户输入,那么您的查询将是:

SELECT * FROM `users` WHERE `username`='admin\' AND 1=1 OR 1=\'1' AND `pass`='pass'

除非用户名和密码与数据库条目匹配,否则不会授予用户访问任何帐户的权限。

<强>验证

验证是对所有数据的检查或验证,这有助于验证数据在传输过程中是否未受到损害或损坏。

如果您将移动平台作为参数,那么您只想允许Android或IOS作为值而其他值无效。如果用户需要一些不能为空的关键输入,那么检查它会进入验证。

但是如果用户提供ANDROID & IOS n输入,那么清理将使ANDROID &amp; IOS成为{1}}。这将不允许用户破坏代码和逻辑

  

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

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

  

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

使用Joi,您可以使用添加选项清理变量

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

答案 2 :(得分:3)

  

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

验证正在验证所提交的数据是否符合开发人员为特定输入字段定义的规则或规则集。

// checks that 22 is a number and must be >=99
Joi.validate(22, Joi.number().min(99));

验证可防止意外或错误的数据输入。

清理只关心确保提交的数据不包含任何代码。比如将字符串中的所有单引号更改为双引号或将<更改为&lt;

清理可防止恶意代码注入或执行。

  

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

是的,你应该。

  

我试图理解我是否应该验证以及消毒。

是的,应该验证并清理您的数据,因为结合这两种技术可以为您的应用程序提供深入的防御。在消毒之前,还应该进行一次验证。

  

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

Joi是一个验证库。它非常适合验证数据。但是对于清理而言,如果使用像string.js这样的方法来获取诸如escapeHTML()和模块xss-filters之类的方法来进行xss清理。