Я знаю, что некоторые люди могут просто отвечать "никогда", если есть пользовательский ввод.Но предположим, что у меня есть что-то вроде этого:
$version = $_REQUEST['version'];
$test = 'return $version > 3;';
$success = eval($test);
Это, очевидно, упрощенный случай, но есть ли что-нибудь, что пользователь может ввести как version
, чтобы заставить это сделать что-то вредоносное?Если я ограничу тип строк, которые $test
может использовать для сравнения значений определенных переменных с другими переменными, есть ли способ, которым кто-нибудь может воспользоваться, чтобы использовать это?
Редактировать
Я попытался запустить следующий скрипт на сервере, и ничего не происходит:
<?php
$version = "exec('mkdir test') + 4";
$teststr = '$version > 3;';
$result = eval('return ' . $teststr);
var_dump($result);
?>
все, что я получаю, это bool(false)
.Новый каталог не создан.Если у меня есть строка, которая на самом деле вызывает exec('mkdir test')
до этого, она действительно создает каталог.Кажется, что он работает правильно, поскольку он просто сравнивает строку, преобразованную в число, с другим числом и обнаруживает, что результат ложен.