我如何只将特殊字符“<”、“>”、“{”、“}”列入黑名单并允许 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(),
  });
});