Більшість сучасних мов (які так чи інакше трактуються) виконують якусь функцію eval . Така функція виконує довільний код мови, більшу частину часу проходить як основний аргумент у вигляді рядка (різні мови можуть додавати більше функцій функції eval).
Я розумію, що користувачам не слід дозволити виконувати цю функцію ( редагувати, тобто приймати прямо чи опосередковано довільний вхід від довільного користувача, на який буде передано eval
), особливо з використанням серверного програмного забезпечення, оскільки вони можуть змусити процес виконувати шкідливий код. Таким чином, підручники та спільноти говорять нам не використовувати eval. Однак є багато разів, коли eval корисний і використовується:
- Спеціальні правила доступу до програмних елементів (IIRC OpenERP має об'єкт,
ir.rule
який може використовувати динамічний код пітона). - Спеціальні обчислення та / або критерії (OpenERP має такі поля, щоб дозволити розрахунки спеціального коду).
- Аналізатори звітів OpenERP (так, я знаю, що я змушую вас з речами OpenERP ... але це головний приклад, який я маю).
- Кодування ефектів заклинання в деяких іграх RPG.
Таким чином, вони добре використовують, якщо вони належним чином використовуються. Основна перевага полягає в тому, що ця функція дозволяє адміністраторам писати спеціальний код без необхідності створювати більше файлів і включати їх (хоча більшість фреймворків, що використовують функції eval, також мають змогу вказати файл, модуль, пакет, ... для читання).
Однак евал є злом у популярній культурі. Такі речі, як проникнення у вашу систему, приходять в голову.
Однак є й інші функції, які можуть бути шкідливими, якщо користувачі якось до них звертаються: від’єднання, зчитування, запис (семантика файлів), розподіл пам’яті та арифметика вказівника, доступ до моделі бази даних (навіть якщо не враховувати випадки, які ін'єкціонуються через SQL).
Так, в основному, у більшості випадків, коли будь-який код не написаний належним чином або його не переглядають належним чином (ресурси, користувачі, середовище, ...), код є злим і може призвести навіть до економічного впливу.
Але є щось особливе з eval
функціями (незалежно від мови).
Питання : Чи є якийсь історичний факт, що цей страх стає частиною популярної культури, замість того, щоб приділяти однакову увагу іншим, можливо, небезпечним рисам?
eval
, він має внутрішню функцію, яка називається, safe_eval
яка готує середовище для запобігання дії коду небезпечних речей. Проте виявлено помилок, оскільки Python є досить гнучкою мовою, і тому її важко контролювати.