Как стать автором
Обновить

Неочевидное поведение assert

Время на прочтение1 мин
Количество просмотров11K
При написании кода любой программист делает проверки. Это нормально :) Для генерации ошибок в PHP есть три механизма:
  • error (собственно ошибки);
  • exception (исключения);
  • assertion (утверждения).

При написании кода и его последующем тестировании было обнаружено совершенно неочевидное поведение функции assert. А теперь немного кода:


<?php
// Предположим у нас есть перменная $x
$test = 'TEST';
 
// Теперь проверим как работает переменная если мы используем ее в условии
if ($test)
    echo "В переменной что-то есть\n";
 
// Код выведет текст "В переменной что-то есть"
 
// А теперь если сделать то же самое с assert
assert($test);
 
// Ассерт отработает нормально, но мы увидим ошибку PHP
// PHP Notice:  Use of undefined constant TEST - assumed 'TEST' in php shell code(1) : assert code on line 1


Что же во всем этом плохого? А то, что в случае, когда в assert передается строка, интерпретатор будет пытаться выполнить ее аналогично eval, что дает огромный простор для различных уязвимостей, так как злоумышленник в некоторых случаях может получить возможность выполнить произвольный код.

<?php
$x = 'TEST';
assert('$x .= $x;');
 
echo $x; // TESTTEST


Документация функции assert.
Теги:
Хабы:
Всего голосов 22: ↑13 и ↓9+4
Комментарии19

Публикации

Истории

Работа

PHP программист
147 вакансий

Ближайшие события