使用 Hapi.JS Joi 模块在 Express.JS 应用程序中验证和清理输入之间的区别?
Difference between validating and sanitizing inputs in an Express.JS app with a Hapi.JS Joi module?
使用 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 兼容库清理输入?
清理是为了防止恶意代码
XSS 清理示例 <script>alert(1)</script>
更改为 <script>alert(1)</script>
以便在浏览器上显示而不执行
验证用于一般检查,例如输入是否为有效电子邮件、phone 号码等
电子邮件验证示例,
长度 > 5,@
应该出现,.
应该出现在 @
等
之后
更新问题 2
清理用户的所有输入是一个非常好的做法。
要记住的重要规则
永远不要相信来自用户的数据。
What's the difference between validation and sanitization?
验证 验证提交的数据是否符合开发人员为特定输入字段定义的规则或规则集。
// checks that 22 is a number and must be >=99
Joi.validate(22, Joi.number().min(99));
验证可防止意外或错误的数据输入。
Sanitization 只关心确保提交的数据不包含任何代码。比如把一个字符串中的所有单引号都改成双引号或者把<
改成<
清理可防止恶意代码注入或执行。
Should I sanitize inputs for an Express API?
是的,你应该。
I'm trying to understand if I should validate as well as sanitize.
Yes 应该验证并清理您的数据,因为结合这两种技术可以为您的应用程序提供深入的防御。在清理之前还应始终进行另一件事验证。
How can I sanitize inputs with Joi or some other Express compatible library?
Joi 是一个验证库。它非常适合验证数据。但是为了消毒,如果宁愿使用像 string.js for methods like escapeHTML() and module xss-filters 这样的东西来进行 xss 消毒。
What's the difference between validation and sanitization?
消毒
清理输入意味着在将输入存储到数据库或将其用于任何其他目的之前检查输入以防止恶意代码注入。
一个基本示例是 SQL 注入,如果您想要 store/verify 数据,则需要考虑注入。假设您正在测试数据库中用户提交的登录凭据。您的查询可能类似于
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'
执行时选择管理字段并以管理员身份登录用户。
但是如果您要清理用户输入,您的查询将是:
SELECT * FROM `users` WHERE `username`='admin\' AND 1=1 OR 1=\'1' AND `pass`='pass'
除非用户名和密码与数据库条目匹配,否则不会授予用户访问任何帐户的权限。
验证
验证是检查或验证任何传入的数据,这有助于验证数据在传输过程中没有受到损害或损坏。
如果您将移动平台作为参数,那么您只想允许 Android 或 IOS 作为值,而其他值不是 valid.If 需要一些关键输入来自不能为空的用户然后检查它进入验证。
但是,如果用户提供 ANDROID & IOS
n 个输入,那么清理会变成 ANDROID & IOS
。不允许用户破坏代码和逻辑
should I sanitize inputs for an Express API?
是的,您应该始终对数据进行清理,就像您将其公开一样 API 然后用户可以将恶意数据插入到移动应用程序的输入中。最好为所有边缘情况做好准备,用户可以做任何事情。 (:眨眼:)
How can I sanitize inputs with Joi or some other Express compatible library?
使用 Joi,您可以使用附加选项清理变量
validate(value, schema, {escapeHtml: true}, [callback])
使用 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 兼容库清理输入?
清理是为了防止恶意代码
XSS 清理示例 <script>alert(1)</script>
更改为 <script>alert(1)</script>
以便在浏览器上显示而不执行
验证用于一般检查,例如输入是否为有效电子邮件、phone 号码等
电子邮件验证示例,
长度 > 5,@
应该出现,.
应该出现在 @
等
更新问题 2
清理用户的所有输入是一个非常好的做法。
要记住的重要规则
永远不要相信来自用户的数据。
What's the difference between validation and sanitization?
验证 验证提交的数据是否符合开发人员为特定输入字段定义的规则或规则集。
// checks that 22 is a number and must be >=99
Joi.validate(22, Joi.number().min(99));
验证可防止意外或错误的数据输入。
Sanitization 只关心确保提交的数据不包含任何代码。比如把一个字符串中的所有单引号都改成双引号或者把<
改成<
清理可防止恶意代码注入或执行。
Should I sanitize inputs for an Express API?
是的,你应该。
I'm trying to understand if I should validate as well as sanitize.
Yes 应该验证并清理您的数据,因为结合这两种技术可以为您的应用程序提供深入的防御。在清理之前还应始终进行另一件事验证。
How can I sanitize inputs with Joi or some other Express compatible library?
Joi 是一个验证库。它非常适合验证数据。但是为了消毒,如果宁愿使用像 string.js for methods like escapeHTML() and module xss-filters 这样的东西来进行 xss 消毒。
What's the difference between validation and sanitization?
消毒
清理输入意味着在将输入存储到数据库或将其用于任何其他目的之前检查输入以防止恶意代码注入。
一个基本示例是 SQL 注入,如果您想要 store/verify 数据,则需要考虑注入。假设您正在测试数据库中用户提交的登录凭据。您的查询可能类似于
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'
执行时选择管理字段并以管理员身份登录用户。
但是如果您要清理用户输入,您的查询将是:
SELECT * FROM `users` WHERE `username`='admin\' AND 1=1 OR 1=\'1' AND `pass`='pass'
除非用户名和密码与数据库条目匹配,否则不会授予用户访问任何帐户的权限。
验证
验证是检查或验证任何传入的数据,这有助于验证数据在传输过程中没有受到损害或损坏。
如果您将移动平台作为参数,那么您只想允许 Android 或 IOS 作为值,而其他值不是 valid.If 需要一些关键输入来自不能为空的用户然后检查它进入验证。
但是,如果用户提供 ANDROID & IOS
n 个输入,那么清理会变成 ANDROID & IOS
。不允许用户破坏代码和逻辑
should I sanitize inputs for an Express API?
是的,您应该始终对数据进行清理,就像您将其公开一样 API 然后用户可以将恶意数据插入到移动应用程序的输入中。最好为所有边缘情况做好准备,用户可以做任何事情。 (:眨眼:)
How can I sanitize inputs with Joi or some other Express compatible library?
使用 Joi,您可以使用附加选项清理变量
validate(value, schema, {escapeHtml: true}, [callback])