PHP - оценивающий параметр
У меня есть следующий код:
<?php
$param = $_GET['param'];
echo $param;
?>
когда я использую это как:
mysite.com/test.php?param=2+2
или же
mysite.com/test.php?param="2+2"
это печатает
2 2
не
4
Я пробовал также Eval - ни работал
2 ответа
Сейчас. Я хотел бы подчеркнуть, чтобы избежать использования eval
как будто это ваш ответ, вы задаете неправильный вопрос. Это очень опасная часть работы. Это может создать больше проблем, чем стоит, согласно ручным спецификациям для этой функции:
Языковая конструкция eval() очень опасна, поскольку она позволяет выполнять произвольный код PHP. Таким образом, его использование не рекомендуется. Если вы тщательно убедились, что нет другого варианта, кроме как использовать эту конструкцию, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленные пользователем, без надлежащей проверки их заранее.
Итак, все, что вы хотите передать в eval, должно быть проверено на соответствие очень... очень строгим критериям, исключая другие вызовы функций и другие возможные злонамеренные вызовы, и убедитесь, что 100% того, что вы передаете в eval, именно так, как вам нужно, Не больше, не меньше.
Очень простой сценарий для вашей проблемы:
if (!isset($_GET['Param'])){
$Append = urlencode("2+2");
header("Location: index.php?Param=".$Append);
}
$Code_To_Eval = '$Result = '.$_GET['Param'].';';
eval($Code_To_Eval);
echo $Result;
Первые строки с 1 по 4 показывают, как правильно передать символ, такой как символ плюс, остальные строки кода работают со строкой данных. & как @andreiP заявил:
Если я не ошибаюсь, "+" используется для кодирования URL, поэтому он будет переведен в%, что в дальнейшем приведет к пробелу. Вот почему вы получаете 2 2
Это правильно. Это объясняет, почему вы получаете ваш текущий вывод и обратите внимание, используя:
echo urldecode($_GET['Param']);
после кодирования он вернет вас к исходному выводу, которого вы хотите избежать.
Я настоятельно рекомендую изучить альтернативу, прежде чем использовать то, что я написал
+
закодирован как пробел в query strings
, Чтобы иметь фактический знак дополнения в вашей строке, вы должны использовать %2B
,
Однако следует отметить, что это не будет выполнять фактическое добавление. Я не верю, что возможно выполнить фактическое добавление внутри query string
,