PHP使用eval()获取字符串形式数组变量值不生效问题排查
问题成因
eval函数的使用逻辑错误:eval()执行的是PHP语句,你直接传入变量表达式$_COOKIE['key1']['key2']['key3'],不会返回该变量的值,只会执行这个表达式语句,默认返回null。因此你的函数最终返回的是null,echo null本身就没有任何输出。- 潜在附加问题:如果你是通过
setcookie()方法设置的Cookie,当前请求的$_COOKIE超全局变量不会立即更新,$_COOKIE只会读取本次请求携带的Cookie值,setcookie()设置的内容需要等到下一次用户发起请求时才会被带到$_COOKIE中。如果你是直接在代码中手动给$_COOKIE赋值,这一点不存在问题。
解决方法
快速修复现有代码
只需要修改eval执行的语句,加上return关键字即可:
function getvar() { $n = func_num_args(); $l = func_get_args(); $t = '$_COOKIE'; for ($i = 0; $i < $n; $i++) { $t .= "['".$l[$i]."']"; } // 加上return和分号,让eval返回变量值 return eval("return {$t};"); }
更安全的替代方案(完全避免使用eval)
eval存在极高的安全风险,如果传入的参数可控,会直接导致远程代码执行漏洞,同时原拼接方案遇到键名包含单引号的场景还会出现语法错误,建议使用遍历的方式实现相同功能:
function getvar(...$keys) { $value = $_COOKIE; foreach ($keys as $key) { if (!isset($value[$key])) { return null; // 层级不存在时返回null,避免报错 } $value = $value[$key]; } return $value; }
内容的提问来源于stack exchange,提问作者Fauzan Samsuri
相关产品推荐
相关产品推荐

