Если пользовательский ввод, являющийся eval()
'd, всегда приходит от пользователя, это должно быть хорошо, единственный вредоносный JavaScript, который они могут затем запустить, - это они сами (что они могли бы сделать в любом случае).
Если он говорит с кодом на стороне сервера, убедитесь, что он проверен как любой другой внешний ввод.
Вы также должны убедиться, что он не может быть предварительно заполнен чем-то вроде параметра GET и т. Д.
Обновление
Если вы используете только базовую математику с переменными, вы можете использовать регулярное выражение, чтобы убедиться, что значение очищено от арифметики, а затем eval()
it.
Например, ваши уравнения могут иметь заполнители CARD1
и CARD2
.
var textarea = document.getElementsByTagName('textarea')[0],
placeholders = ['CARD1', 'CARD2'];
document.getElementsByTagName('button')[0].onclick = function() {
var value = textarea.value;
// Strip placeholders
var placeholderStripped = value.replace(new RegExp(placeholders.join('|'), 'g'), '');
var safe = placeholderStripped.match(/^[\d\+\-\/\*\(\)]+$/);
if (safe == null) {
alert('Not a valid equation');
return;
}
for (var i = 0, placeholdersLength = placeholders.length; i < placeholdersLength; i++) {
value = value.replace(new RegExp(placeholders[i], 'g'), document.getElementById(placeholders[i].toLowerCase()).value);
}
document.getElementById('result').innerHTML = eval(value);
}
jsFiddle .
- Используйте простые имена местозаполнителей и все заглавные буквы для удобства. Если вы используете более сложные имена, вам, возможно, придется использовать функцию экранирования регулярных выражений, прежде чем
join()
их.
- Допускаем числа
0-9
, +
, -
, /
, *
, (
и )
. Мы не разрешаем десятичные дроби в настоящее время. Это может быть добавлено при необходимости.
- Когда мы наконец
eval()
введем ввод, он должен содержать только имена заполнителей (которые будут заменены) и основные арифметические символы выше.
- Приведенный выше код сильно зависит от контекста jsFiddle. Конечно, вы никогда не допустите, чтобы имена заполнителей были произвольными - сделайте их такими, какими они должны быть.