gpt4 book ai didi

php - 安全地使用 php : modifying user input to avoid security issues 中的 eval 函数

转载 作者:可可西里 更新时间:2023-11-01 01:03:16 26 4
gpt4 key购买 nike

我正在接管一些使用 eval() 的网页游戏代码php中的函数我知道这可能是一个严重的安全问题,所以我希望在决定是否取消该部分代码之前帮助审查检查其参数的代码。目前我已经从游戏中删除了这部分代码,直到我确定它是安全的,但功能损失并不理想。我宁愿对此进行安全验证,也不愿重新设计整个段以避免使用 eval(),假设这样的事情是可能的。据称可以防止恶意代码注入(inject)的相关代码片段如下。 $value 是一个用户输入的字符串,我们知道它不包含“;”。

1 $value = eregi_replace("[ \t\r]","",$value);
2 $value = addslashes($value);
3 $value = ereg_replace("[A-z0-9_][\(]","-",$value);
4 $value = ereg_replace("[\$]","-",$value);
5 @eval("\$val = $value;");

这是我目前的理解:

1) 从 $value 中删除所有空格

2) 转义数据库调用需要它的字符(我不清楚为什么需要这个)

3) 查找紧跟\或 ( 的字母数字字符,并将它们的组合替换为 -。大概这是为了删除字符串中任何类似函数调用的内容,但我不清楚为什么它也删除前面的字符,这就是为什么在第 2 行明确添加它们之后它也会删除\的原因。

4) 将 $ 的所有实例替换为 - 以避免在字符串中出现任何类似对 php 变量的引用。

那么:这里有没有留下任何漏洞?我是否误解了上面的任何正则表达式?最后,有没有什么方法可以在不排除 ( 字符的情况下对此进行安全验证?要输入的字符串理想情况下是一个数学公式,并且允许 ( 将允许操纵操作顺序,这在目前是不可能的。

最佳答案

  1. 评估 VM 内的代码 - 参见 Runkit_Sandbox

  2. 或者为您的数学创建一个解析器。我建议你使用内置的 tokenizer .您需要迭代标记并跟踪方括号、T_DNUMBERT_LNUMBER、运算符,也许还有 T_CONSTANT_ENCAPSED_STRING。忽略其他一切。然后您可以安全地计算结果表达式。

  3. Google 快速搜索显示 this library .它完全符合您的要求...


一个使用分词器的简单例子:

$tokens = token_get_all("<?php {$input}");
$expr = '';

foreach($tokens as $token){

if(is_string($token)){

if(in_array($token, array('(', ')', '+', '-', '/', '*'), true))
$expr .= $token;

continue;
}

list($id, $text) = $token;

if(in_array($id, array(T_DNUMBER, T_LNUMBER)))
$expr .= $text;
}

$result = eval("<?php {$expr}");

( test )

这仅在输入是有效的数学表达式时才有效。否则你会在你的 eval`d 代码中得到一个解析错误,因为空括号和类似的东西。如果您也需要处理此问题,请在另一个循环中清理输出表达式。这应该处理大部分无效部分:

while(strpos($expr, '()') !== false)
$expr = str_replace('()', '', $expr);

$expr = trim($expr, '+-/*');

关于php - 安全地使用 php : modifying user input to avoid security issues 中的 eval 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com