- PVSM.RU - https://www.pvsm.ru -

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

При написании кода любой программист делает проверки. Это нормально :) Для генерации ошибок в PHP есть три механизма:error (собственно ошибки);

exception (исключения);

assertion (утверждения).

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

 

<?php

// Предположим у нас есть перменная $x

$x = 'TEST';

 

// Теперь проверим как работает переменная если мы используем ее в условии

if ($test)

    echo "В переменной что-то естьn";

 

// Код выведет текст "В переменной что-то есть"

 

// А теперь если сделать то же самое с assert

assert($x);

 

// Ассерт отработает нормально, но мы увидим ошибку 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.


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/1908