Как вычислить строковые математические выражения в скрипте java? - PullRequest
0 голосов
/ 12 июля 2020

Пожалуйста, предложите альтернативу eval (), поскольку она очевидно «небезопасна». Был бы признателен за объяснение, почему. Я использовал этот код для своего калькулятора, и он работает, но я хотел бы его оптимизировать.

if (e.target.innerHTML === "="  ){

    newArr=arr.join(' ');
    var result =eval(newArr);
    pnode.innerHTML = result;
    
}

else
{

    pnode.innerHTML = e.target.innerHTML;
    arr.push(e.target.innerHTML);
    console.log(arr);

}

Ответы [ 4 ]

1 голос
/ 12 июля 2020

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

Однако в вашем случае, поскольку вы не обслуживаете данные от одного пользователя другому, нет возможности, что строка могла быть затронута третьей стороной, и вполне нормально использовать eval. См. этот вопрос . Тем не менее eval относительно неэффективен по сравнению с альтернативой Function. Функция хоть и небезопасна, но более безопасна, но мы уже установили, что этот тип уязвимости не применим к вашему варианту использования. Более важным является тот факт, что (по крайней мере, согласно документам MDN) Function более эффективен. Просто сделайте: var result = Function("return" + newArr)();.

Ваш клиент по-прежнему сможет писать такие глупые вещи, как while(true){console.log("infinite loop")}, но они все равно могли бы сделать это через консоль, и это не повлияет ни на кого другого. В заключение, eval и подобные функции часто слепо осуждаются как «небезопасные», но это верно только в определенных контекстах.

0 голосов
/ 12 июля 2020

Функция может помочь。

const fun = new Function('a', 'b', 'return a + b')
console.log(fun(1, 2)) // output: 3
0 голосов
/ 12 июля 2020

Самый «правильный» способ сделать это (который не был бы восприимчив к чему-то вроде while(1) {}) - использовать библиотеку оценщика выражений, такую ​​как Math JS

0 голосов
/ 12 июля 2020

Вместо использования метода eval() мы можем использовать объекты . Храните данные как value в свойствах, где key является идентификатором объекта.

пример:

let obj = {a: 9, b: 10};  
console.log(obj.a +  obj.b); 

OR,

, если вам нужен заменитель для eval(), см. Приведенный ниже фрагмент, используя строку, которая вычисляет сумму 9 и 10:

console.log(Function('return ' + '9 + 10')())     // 19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...