[英]PHP eval error when assigning value to variable
我有一些PHP代码(用于CMS的模块功能(不是drupal),使人们可以查看页面,评论,论坛帖子,博客帖子等):
if(isset($_GET["m"]))
{
//Does the module exist and activated, and has it a function called view?
if(isset($module_exists[$_GET["m"]]) && method_exists($_GET["m"], "view"))//Yep
{
//Load view (should be an array)
eval("$module_view = ".$_GET["m"]."::view();");
if(!is_array($module_view))//Not an array :(
{
error::e500module($_GET["m"], $_SERVER["REQUEST_URI"]);
}
}
else//Nope, so display error
{
error::e404($_SERVER['REQUEST_URI']);
}
}
现在,我在解析页面时遇到以下错误:
Notice: Undefined variable: module_view in C:\wamp\www\SYSTEM\start.php on line 34
Parse error: parse error in C:\wamp\www\SYSTEM\start.php(34) : eval()'d code on line 1
Notice: Undefined variable: module_view in C:\wamp\www\SYSTEM\start.php on line 35
但是当我这样做时:
eval("print_r(".$_GET["m"]."::view());");
代替:
eval("$module_view = ".$_GET["m"]."::view();");
我没有收到任何错误,只是打印了数组。 有人知道我做错了吗? 我不明白 我知道,请不要告诉我eval()不安全。
谢谢。
您永远不要做任何评估。 这是执行此操作的正确方法:
$class = $_GET["m"];
$module_view = $class::view();
但是即使在这里,您也应该有一个数组,并在执行包含$ class的任何代码之前检查$ class是一个授权模块,因为它是用户输入且用户输入不可信任:
$class = $_GET["m"];
if (!in_array($class, $authorized_modules))
{
header("HTTP/1.1 404 Not Found"); // always good to send a 404 in these cases, so search engines won't index the url
die("Content not found");
}
$module_view = $class::view();
请注意,您的错误是因为您必须在eval中对变量进行转义:
eval("\$module_view = ".$_GET["m"]."::view();");
否则,在将其作为字符串赋给eval()之前先对其求值。
您可以使用call_user_func()
代替eval()
$module_view = call_user_func(array($_GET["m"], 'view'));
有关回调伪类型,请参阅文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.