Может ли строка javascript быть оценена как функция без eval? - PullRequest
0 голосов
/ 08 декабря 2018

Я выполняю аудит кода, и злоумышленник может перезаписать метод toString из-за нежелательного поведения.Метод toString перезаписывается строкой, а не методом.

Возьмите следующий код:

let a = new Object();
a.toString = "function(){ return 'hello world' }"

a.toString - это строка, а не функция здесь.Таким образом, a.toString() не будет работать.

Возможен ли взлом, который может привести к случайному выполнению строки toString (учитывая, что строка может быть чем угодно, а не eval)?

1 Ответ

0 голосов
/ 08 декабря 2018

Из вашего поясняющего комментария:

Я провожу аудит кода, и метод toString можно переписать.Поскольку входные данные поступают от клиента, он перезаписывает метод toString экземпляра строкой, отправленной клиентом.Мне было интересно, есть ли здесь какой-либо риск безопасности.

Если ваш код не делает что-то, чтобы превратить эту строку в функцию (eval(a.toString), new Function(a.toString), btn.onclick = a.toString;, ...),оно не станет единым, так что в этом смысле это не угроза безопасности.Любая попытка вызвать toString на a (явно или неявно) вместо этого получит ошибку.Например, вот неявное использование toString:

let a = new Object();
a.toString = "function(){ return 'hello world' }"
String(a); // TypeError: a.toString is not a function

Это явно нежелательно, но вы сказали, что это ошибка, и пытаетесь выяснить, в какой степени ее можно использовать.Я бы сказал, что он не особо подходит для использования.

...