以下是我想知道的一个简单例子,在我们开始之前我知道只有在绝对需要的时候才能使用eval。
假设我有一个运行某些代码的端点:
endpoint.php
<?php
$input = sanitised($_POST['someData']);
$array = someDatabaseQueryMethod($input);
echo 'runtime.getItem("'.A_SAFE_DEFINED_CONSTANT.'").stateChange({"newValues":'.json_encode($array).'});';
?>
然后我有一个 index.php ,如下所示:
... ommitted...
<body>
$.ajax({
url : "./endpoint.php",
type: "POST",
data : {someData: 1},
success: function(data, textStatus, jqXHR)
{
eval(data);
},
error: function (jqXHR, textStatus, errorThrown)
{
//error logic here
}
});
...
是否存在可能出现的情况,其中$ array中的某些内容(可以说,它可以包含任何内容,多维,不同字符串/其他数据类型的加载,但始终是赢得的有效数组&# 39; t导致json_encode失败)可能意味着eval语句可能容易受到某种注入?
实际上,我总是希望.stateChange接收一个可以查看的对象并决定在这个例子中做什么
我知道这可能看起来像是一个非常复杂的例子,它脱离了上下文 - 这是我能想到的最小的可验证的例子。
编辑:虽然以上内容接近我正在做的事情,但我猜最小的例子实际上就是这样:
endpoint.php
<?php
$input = sanitised($_POST['someData']);
$array = someDatabaseQueryMethod($input);
echo 'var a = '.json_encode($array).';';
?>
好的家伙我明白了 - 不需要更多的评论不能回答不同于做同样事情的不同方法的问题,但感谢您的反馈
如果有一个例子可以解决这个问题,那就太好了,而不是关于eval有多糟糕的传闻。
答案 0 :(得分:1)
是否存在可能出现在$ array中的某些内容的情况 (可以说,它可以包含任何东西,多维, 加载不同的字符串/其他数据类型,但总是一个 有效的数组,不会导致json_encode失败)可能意味着 评估声明可能容易受到某种注射?
是的,绝对!如果我是一名黑客,如果在转义用户字符串时出现最轻微的错误,我很可能会找到一种劫持用户整个会话的方法。绝对没有理由你需要承担这种风险。请改用JSON.parse(str)
。由于您当前正在返回JavaScript代码,因此将其更改为仅将您的值作为具有两个值的对象返回,您可以自动执行两项操作。 (例如:{stateChangeTarget: 'CONSTANT_IDENTIFIER', stateChangeData: {"newValues": [...]} }
)这将为您提供所需的数组。然后在结果中执行预期的函数,如下所示:
dataType: "json"
success: function(data)
{
runtime.getItem(data.stateChangeTarget).stateChange(data.stateChangeData);
},
这也可以扩展到其他客户端应用程序。如果您决定编写移动应用程序,该应用程序将无法运行JavaScript,因此当服务器返回纯JavaScript命令而没有中立的方式来访问数据时,它将会丢失(JSON)