我如何只将特殊字符“<”、“>”、“{”、“}”列入黑名单并允许 Joi JS Validator 中的所有其他字符
How do i blacklist only special character "<", ">", "{", "}" and allow everything else in Joi JS Validator
大家好!
我想在我的 React Native
应用程序中阻止跨站点脚本,方法是将一个特殊字符列入黑名单,如果该字符被插入到我的 RealmDB
中就太危险了
我确实阅读了文档并找到了一些名为 .disallow()
、.not()
和 .invalid()
的 API,
这个 APIs 只验证一个字符或一个词,这意味着如果我插入一个具有黑名单中特殊字符的值,如 "<script>"
验证将通过,但如果我只插入 "<"
验证会出错,我找不到另一个 API 黑名单只包含特殊字符 "<"
、">"
、"{"
、"}"
并允许其他所有字符,我真的希望 Joi 有一个像 .pattern()
一样的 API 但它被颠倒了。我希望有人有一个很酷的自己的方法并与 Joi 集成,如果在这里分享会很有帮助
我有一些 Joi 浏览器的示例代码,希望 Joi NodeJS 也一样
var dataObj = {
userNotes: '<script>' // "<" and ">" is on the blacklist
};
var validationSchema = {
userNotes: Joi.string().trim().required().invalid('<', '>', '{', '}')
};
Joi.validate(dataObj, validationSchema).then(function(success) {
console.log(success); // Will be success not Error
}).catch(function(error) {
console.error(error)
});
<script src="https://cdn.jsdelivr.net/npm/joi-browser@13.4.0/dist/joi-browser.min.js"></script>
仔细阅读了大约 2 小时的文档后,我发现了一个 API 它叫做 .custom()
它允许您创建自己的验证以及自定义错误消息。 请记住,它仅适用于 Joi NodeJS,不适用于 joi-browser
这里有一些示例代码
import Joi from 'joi';
/**
* Blacklist special character
* "<", ">", "{", "}"
* you can add more just inside "[]" in myRegexPattern
*/
// I use regex for my own Joi validation
// This regex will find anything character inside "[]" in the string
// I don't know it's good or bad Regex
// PLEASE FIX THIS if it's bad Regex
const myRegexPattern = new RegExp(/^.*[<>{}].*$/s);
// This string is very bad for my React Native apps
const userInputValue = "<Button onPress={() => alert('Whoops!')}></Button>";
// Now test it with Joi
const validationSchema = Joi.string().custom((value, helpers) => {
// if true Joi will be throw an error with code "any.invalid"
// The "code" NOT a "message" error
return myRegexPattern.test(value) ? helpers.error('any.invalid') : value
}).messages({
// errorCode: errorMessage
'any.invalid': "Whooaaa! That's a Bad String"
});
// It will be resulting an error and that's what i wan to
// because that input value is soo bad
validationSchema.validateAsync(userInputValue)
.then(success => {
console.log(`Success value: ${success}`);
})
.catch(error => {
console.error(error);
});
如果有人有更好的答案post,那将非常有帮助
自定义验证器很好,但如果你只是测试正则表达式,你可以让你的生活更轻松并使用 string.pattern
first_name: Joi.string().required().regex(/[$\(\)<>]/, { invert: true }),
如果您的 first_name 中有 $,(,),<,>
,此规则将引发错误。
如果您省略 { invert: true }
选项,它将要求您在 first_name 中包含 $,(,),<,>
,而没有人应该这样做。我怀疑这会使某人在 21 世纪及以后的生活变得非常艰难。
文档
https://joi.dev/api/?v=17.3.0#stringpatternregex-name--options---aliases-regex
Joi 有内置验证器,只允许字符串和字符串中的数字。
有关使用示例,请参阅下面的示例架构:
const schema = Joi.object().keys({
firstname: joi.string().alphanum().required(),
lastname: joi.string().alphanum(),
});
});
大家好!
我想在我的 React Native
应用程序中阻止跨站点脚本,方法是将一个特殊字符列入黑名单,如果该字符被插入到我的 RealmDB
我确实阅读了文档并找到了一些名为 .disallow()
、.not()
和 .invalid()
的 API,
这个 APIs 只验证一个字符或一个词,这意味着如果我插入一个具有黑名单中特殊字符的值,如 "<script>"
验证将通过,但如果我只插入 "<"
验证会出错,我找不到另一个 API 黑名单只包含特殊字符 "<"
、">"
、"{"
、"}"
并允许其他所有字符,我真的希望 Joi 有一个像 .pattern()
一样的 API 但它被颠倒了。我希望有人有一个很酷的自己的方法并与 Joi 集成,如果在这里分享会很有帮助
我有一些 Joi 浏览器的示例代码,希望 Joi NodeJS 也一样
var dataObj = {
userNotes: '<script>' // "<" and ">" is on the blacklist
};
var validationSchema = {
userNotes: Joi.string().trim().required().invalid('<', '>', '{', '}')
};
Joi.validate(dataObj, validationSchema).then(function(success) {
console.log(success); // Will be success not Error
}).catch(function(error) {
console.error(error)
});
<script src="https://cdn.jsdelivr.net/npm/joi-browser@13.4.0/dist/joi-browser.min.js"></script>
仔细阅读了大约 2 小时的文档后,我发现了一个 API 它叫做 .custom()
它允许您创建自己的验证以及自定义错误消息。 请记住,它仅适用于 Joi NodeJS,不适用于 joi-browser
这里有一些示例代码
import Joi from 'joi';
/**
* Blacklist special character
* "<", ">", "{", "}"
* you can add more just inside "[]" in myRegexPattern
*/
// I use regex for my own Joi validation
// This regex will find anything character inside "[]" in the string
// I don't know it's good or bad Regex
// PLEASE FIX THIS if it's bad Regex
const myRegexPattern = new RegExp(/^.*[<>{}].*$/s);
// This string is very bad for my React Native apps
const userInputValue = "<Button onPress={() => alert('Whoops!')}></Button>";
// Now test it with Joi
const validationSchema = Joi.string().custom((value, helpers) => {
// if true Joi will be throw an error with code "any.invalid"
// The "code" NOT a "message" error
return myRegexPattern.test(value) ? helpers.error('any.invalid') : value
}).messages({
// errorCode: errorMessage
'any.invalid': "Whooaaa! That's a Bad String"
});
// It will be resulting an error and that's what i wan to
// because that input value is soo bad
validationSchema.validateAsync(userInputValue)
.then(success => {
console.log(`Success value: ${success}`);
})
.catch(error => {
console.error(error);
});
如果有人有更好的答案post,那将非常有帮助
自定义验证器很好,但如果你只是测试正则表达式,你可以让你的生活更轻松并使用 string.pattern
first_name: Joi.string().required().regex(/[$\(\)<>]/, { invert: true }),
如果您的 first_name 中有 $,(,),<,>
,此规则将引发错误。
如果您省略 { invert: true }
选项,它将要求您在 first_name 中包含 $,(,),<,>
,而没有人应该这样做。我怀疑这会使某人在 21 世纪及以后的生活变得非常艰难。
文档
https://joi.dev/api/?v=17.3.0#stringpatternregex-name--options---aliases-regex
Joi 有内置验证器,只允许字符串和字符串中的数字。 有关使用示例,请参阅下面的示例架构:
const schema = Joi.object().keys({
firstname: joi.string().alphanum().required(),
lastname: joi.string().alphanum(),
});
});