MaKvc
@MaKvc
Отчаянный веб-разработчик

Насколько опасно использование конструктора Function?

В описании на MDN написано:

такой способ представляет угрозу для безопасности

Что это значит? Есть ли более подробное описание проблемы?
У меня есть свой, костыльный фреймформ. Суть проблемы в том, что есть компонент у которого необходимо иметь возможность форматировать вывод данных.

<div data-range="{ min: 1000, max: 8000  и т.д. ... }" data-format-value="Math.floor(value / 100)">
    <span class="range-value"><span>
    <!-- Тело компонента .... --->
</div>
<div data-range="{ min: 0, max: 100  и т.д. ... }" data-format-value="Math.floor((value / 1000) + 200)">
    <span class="range-value"><span>
    <!-- Тело компонента .... --->
</div>

// в недрах компонента
inputValue - это значение поля input range
formatValue - это new Function('value', 'return /* тут значение атрибута data-format-value */')
rangeValueEl - это элемент с классом 'range-value'
// вывод данных
rangeValueEl.textContent = formatValue(inputValue)

Такми образом, планировал достичь желаемого результата. То есть, иметь возможность трансформировать значение согласно требованиям.
ПС: Постарался все максимально упростить. Компоненты более сложные. Если все выкладывать, полотенце будет конкретное. Надеюсь, все понятно описал и суть согласно вопросу ясна. В конечном счете, речь не о компонентах а об использовании конструктора Function...
  • Вопрос задан
  • 509 просмотров
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
такой способ представляет угрозу для безопасности

Потому, что если злоумышленник будет иметь возможность статично внедрять HTML-фрагменты в тело документа, не имея доступа к интерпретатору JS пользователя, то с помощью атрибута data-format-value он эту возможность получит напрямую, так как может вставлять любой код JS в этот атрибут, получая доступ к локальному хранилищу, кукам. Если по кукам он не угонит сессию пользователя, то хотя бы сможет составить его фингерпринт.
Ответ написан
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
И конструктор Function, и eval, в теории позволяют без каких-либо проверок выполнить код, который мы не контролируем. Мы не можем проверить его на этапе разработки и не можем быть уверенными, что у пользователя будет выполняться именно он. Он прилетает откуда-то. И весь вопрос в доверии к источнику. Если кто-то (пользователи, контент-редакторы, или кто там еще может быть) может влиять на то, что прилетит - возникает простор для потенциальных атак на пользователей системы. Кто-то что-то куда-то написал, скопипастил, а потом это что-то у пользователя выполнилось. И кто знает, что оно с данными пользователя сделает. Тут каждый оценивает риски сам, но в общем случае выполнять непроверенный код действительно не рекомендуется.

В вашем случае скорее всего можно поделить формулы на части. Сделать отдельно число-масштаб, отдельно число-смещение. В вопросах фоматирования данных обычно есть разнообразие значений коэффициентов в формулах, но при этом мало различных смыслов этих самых коэффициентов. Так что именно отдельная формула на каждый чих обычно не нужна, нужны просто разные числа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 мая 2024, в 14:44
500 руб./за проект
02 мая 2024, в 14:36
3000 руб./за проект
02 мая 2024, в 14:29
30000 руб./за проект