Pull to refresh

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

Reading time1 min
Views11K
При написании кода любой программист делает проверки. Это нормально :) Для генерации ошибок в 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.
Tags:
Hubs:
+4
Comments19

Articles