Этот белый список выглядит безопасным для меня, но это не такой простой вопрос.Например, в некоторых браузерах eval-строка, подобная этой:
/.(.)/(34)
, эквивалентна этой:
new RegExp('.(.)').exec('34')
и поэтому возвращает массив ['34','4']
.Это "безопасно"?
Таким образом, хотя подход, вероятно, может быть сделан для безопасной работы, это может быть очень сложное предложение.Если вы продолжите эту идею, я думаю, что вы должны использовать намного более агрессивный подход для проверки ваших входных данных.Ваш принцип должен звучать так: «это член четко определенного набора строк, который, как известно, является« безопасным »», а не «это член плохо определенного набора строк, который исключает все строки, которые, как известно, являются« небезопасными ».«».Кроме того, чтобы избежать какого-либо риска заглядывания операторов, которые вы не рассмотрели (например, ++
или +=
или еще много чего), я думаю, вам следует вставить пробел перед каждым символом, не состоящим из цифр и без точек;и чтобы избежать риска, что скобки вызовут вызов функции, я думаю, что вам следует обрабатывать их самостоятельно, многократно заменяя (...)
пробелом плюс результат вычисления ...
(после подтверждения того, что результатом является число) плюс пробел.
(Кстати, а почему =
в вашем белом списке? Я просто не могу понять, для чего это полезно!)