我正在接管一些在PHP中使用eval()函数的webgame代码。我知道这可能是一个严重的安全问题,所以在决定是否取消这部分代码之前,我希望得到一些帮助来检查代码的参数。目前我已经从游戏中删除了这部分代码,直到我确定它是安全的,但功能的损失是不理想的。我宁愿对此进行安全保护,而不是重新设计整个段以避免使用eval(),假设这样的事情是可能的。下面是防止恶意代码注入的相关代码片段。$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;");
以下是我到目前为止的理解:
所以:这里留下了什么洞吗?我是否误解了上面的regex?最后,是否有任何方法可以在不排除字符的情况下进行安全验证,输入的字符串最好是一个数学公式,并且允许操作顺序的操作,这在目前是不可能的。
>
评估VM中的代码-请参见runkit_sandbox
或者为你的数学创建一个解析器。我建议你使用内置的标记器。您需要迭代标记并跟踪括号、t_dnumber
、t_lnumber
、运算符以及t_constant_encapsed_string
。别管其他的。然后可以安全地计算结果表达式。
一个快速的谷歌搜索揭示了这个图书馆。它完全符合你的要求...
$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}");
只有当输入是有效的数学表达式时,这才会起作用。否则,您将在eval'd代码中得到一个解析错误,因为空括号之类的东西。如果您也需要处理这个问题,那么在另一个循环中清理输出表达式。这应该照顾到大部分无效部分:
while(strpos($expr, '()') !== false)
$expr = str_replace('()', '', $expr);
$expr = trim($expr, '+-/*');
我一直在思考jvm安全的工作方式。原则是,jvm始终信任并运行任何本地代码。因此,从概念上讲,如果您的代码没有显式或隐式调用<code>checkpermission(permission)</code>,这意味着它永远不会失败任何安全验证。当然,所有这些验证调用通常都是在JavaAPI类中完成的,因此我们不需要为内置权限调用它们。 现在,只要您使用内置类(如<code>FileOutputStr
问题内容: 我将UNLINK与和一起使用。我知道这种方式非常危险,因为每个人都可以删除任何文件。但是我需要使用,因为删除文件时无法重新加载页面。 那么,我该如何做才能只允许拥有该文件的用户删除该文件? 如果您认为我在这里做错了什么,或者您有其他想法,并且认为这将是有用的,也请让我知道其他事情:) 我的PHP代码: 我的AJAX代码: 问题答案: 您需要以某种方式对用户进行身份验证。 您的用户需要使
问题内容: 在我的网站上,我有一个名为的变量,其中包含来自表单的输入。然后,我在用户页面上显示此变量(通过echo)。 使用此变量来避免任何安全风险的最佳方法是什么?我使用,但这还不够。 此变量也将保存到MySQL数据库。 问题答案: 为避免严重的安全问题,必须执行两项非常重要的操作。 您需要先对用户输入进行转义,然后再将其放入SQL查询中。转义表示转义所有特殊字符,如; 幸运的是,有一个函数已经
问题内容: 使用createQuery()。list之后是否可以避免投射警告? 我希望找到一种通过通用参数或方法参数指定目标对象的方法,如下所示: 问题答案: 要记住的最重要的一点是, 警告是由于编译器引起的,而不是hibernate的 -您可以告诉编译器忽略未实现的泛型。通过使用HQL,我们以一种类型安全的方式查询数据,不幸的是,java无法进行验证。 有很多方法可以避开hibernate转换的
问题内容: locals()函数的文档特别警告不要修改其输出,因为解释器可能无法反映本地范围的更改。我假设这意味着Python规范不需要它,即使它可以在CPython中工作。 我想知道globals()是否相同。文档中没有警告,但我感到奇怪的是,这会有所不同,因为每个函数显然在不同的范围内执行相同的操作。 如果安全的话,修改globals()的输出将改善我正在处理的项目的简单性和兼容性。 问题答案
我已经使用了eval,但是通过应用CSP来禁止它。但我在找一个替代方案。 我找到了函数。 投掷: 未捕获的EVALERROR:拒绝将字符串计算为JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本源:“script-src”self“”unsafe-inline“http://localhost:6060/wtlority/http://localhost:60