php json_encode输出上的javascript eval - 安全问题

时间:2016-02-23 14:41:51

标签: javascript php

以下是我想知道的一个简单例子,在我们开始之前我知道只有在绝对需要的时候才能使用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有多糟糕的传闻。

1 个答案:

答案 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)