Назначение опции JSLint "запретить небезопасность в регулярном выражении"
У меня есть строка кода, которая получает следующую ошибку при запуске через JSLint:
Lint at line 604 character 48: Insecure '^'.
numExp = parseInt(val[1].replace(/[^\-+\d]/g, ""), 10);
Эта ошибка, похоже, относится к следующему описанию на странице параметров JSLint:
"true if . and [^...] should not be allowed in RegExp literals.
These forms should not be used when validating in secure applications."
Я не совсем понимаю, как приложение javascript на стороне клиента действительно может считаться безопасным. Даже с самым воздухонепроницаемым регулярным выражением, все равно можно запустить что-то вроде firebug и изменить переменную в любом случае. Действительная проверка ввода должна выполняться на сервере, и браузер клиента должен, вероятно, придерживаться проверки, которая будет обрабатывать злоупотребление вашего обычного пользователя.
Можно ли игнорировать эту ошибку? Я упускаю угол здесь, где мое приложение будет небезопасным из-за проверки на стороне клиента?
Ответы
Ответ 1
"Небезопасный" означает "неспецифический" в этом контексте. Как точка .
, так и эксклюзивный диапазон [^…]
не имеют четкого определения того, что должно соответствовать регулярному выражению. Для целей проверки это может предложить риск успешного соответствия материалам, о которых вы не думали и не хотите (подумайте: белый список или черный список).
В любом случае, точка и эксклюзивный диапазон являются действительными частями регулярного выражения, и если они делают то, что вам нужно (например, в этом случае), я думаю, что предупреждение является чрезмерно осторожным.
Злоумышленник может в любое время возиться с вашей логикой страницы; предупреждение больше связано с регулярной работой страницы.
Ответ 2
Все, что он пытается сказать вам, состоит в том, что обычно лучше указать, что можно ввести вместо того, что не может.
В этом случае ваше регулярное выражение фактически уничтожает плохие символы, поэтому безопасно игнорировать предупреждение.