Пользовательский Vallidator для запрета конкретного списка слов - PullRequest
2 голосов
/ 27 июня 2019

Мне нужен собственный валидатор, чтобы забанить определенный список запрещенных слов из поля textarea.Мне нужен именно этот тип реализации, я знаю, что логически неправильно разрешать пользователю вводить часть запроса, но это именно то, что мне нужно.

Я пытался с помощью regExp, но у него странное поведение.

My RegExp

/(drop|update|truncate|delete|;|alter|insert)+./gi

my Validator

export function forbiddenWordsValidator(sqlRe: RegExp): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } | null => {
    const forbidden = sqlRe.test(control.value);
    return forbidden ? { forbiddenSql: { value: control.value } } : null;
  };
}

my formControl:

whereCondition: new FormControl("", [
      Validators.required,
      forbiddenWordsValidator(this.BAN_SQL_KEYWORDS)...

Работает только в определенных случаях, а я нетпонять, почему одна и та же строка работает один раз и не работает, если я удаляю символ и перезаписываю его, а иногда, если я набираю пробел, валидатор возвращает ok.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Здесь есть несколько проблем:

  • Глобальный модификатор g приводит к неожиданным чередующимся результатам при использовании в RegExp#test и аналогичных методах, которые перемещают индекс регулярного выражения после действительного соответствия, он долженбыть удаленным
  • . в конце требуется любой 1 символ, кроме символа разрыва строки, следовательно, его необходимо удалить.

Использовать

/drop|update|truncate|delete|;|alter|insert/i

Или, чтобы сопоставить слова как целые слова, используйте

/\b(?:drop|update|truncate|delete|alter|insert)\b|;/i

Таким образом, insert в insertion и drop в dropout не будут «пойманы» (= совпали).

См. Демоверсию regex .

0 голосов
/ 28 июня 2019

не очень хорошая идея давать такую ​​власть пользователю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...