2

在我的 UI 中,用户可以构建一些 javascript 对象,例如:

var box = {
    "width": "100px",
    "height": "200px",
    "click": function () {
        alert("You clicked the box");
    }
};

这是一个有效的 javascript 对象。现在,我想要一种在 php 中验证这一点的方法。我可以使用json_encode/json_decode但它不起作用"function() ..."。你有什么建议吗?

4

3 回答 3

4

对于快速、肮脏和不安全的解决方案,您可以在服务器上安装,并调用 PHPexec()来验证代码。

从文档中, exec 定义为:

string exec ( string $command [, array &$output [, int &$return_var ]] )

并且使用 node,我们可以使用-e标志来评估 JavaScript 字符串。使用命令行的示例:

> node -e 'invalid javascript'
SyntaxError: Unexpected identifier
> $?
-bash: 8: command not found   # <-- return status!

将它与 PHP 的 exec 结合起来,你可以得到这样的东西:

<? php
$userJavaScript = getUserJavaScriptSomehow();
exec("node -e '" + $userJavaScript + "'", $output, $return_var);
if ($return_var !== 0) {
    // something went wrong with parsing it.
}
?>

请注意,这是一个可怕的解决方案。考虑到用户可以执行任意代码,您最好在客户端验证 JavaScript 而忘记在服务器端进行验证。您必须防止文件访问、无限循环等。

于 2013-09-02T13:13:24.127 回答
2

我想您尝试验证从用户输入构建的对象。由于在 PHP 中编写完整的 JavaScript 解析器会很困难,因此我建议采用以下方法:输入所有数据后,通过 Ajax 从 PHP 脚本请求 JavaScript 对象。然后您可以在客户端进行 eval 以查看是否有任何错误。

更一般的建议:不要混合可执行代码和数据!只需在客户端和服务器之间交换易于验证的 JSON 对象,并编写一些处理 JSON 对象的静态 JavaScript 代码。这也将更好地保护您免受来自用户输入的代码注入。

于 2013-09-02T13:04:19.260 回答
2

PHP 只能验证代码的 JSON 部分。如果您想要服务器端技术,请使用 nodejs。通过node code.js简单地运行代码,看看是否有任何错误。因此,我想您应该获取代码,将其保存到文件并针对它运行节点。

于 2013-09-02T13:05:13.547 回答