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

в 19:28, , рубрики: assert, assertion, php, метки: , ,

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


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js