通过AJAX发送js函数

时间:2017-01-09 09:52:31

标签: javascript json ajax

我想将“javascript函数”传递给我的后端,我正在使用ajax。 这是一个简短的例子:

var data = { 
    prop: function (e) { alert(e) }
};
ajax.(..., data: data, dataType: "json")...

这会自动从数据中删除prop,因为它是一个函数。

如何使用json将此功能传递给我的后端?不将其转换为字符串。

2 个答案:

答案 0 :(得分:5)

你真的想要从客户端向服务器发送功能并在服务器上执行该功能,而不是没有很多的安全检查。想一想,记住你不能相信你从客户那里得到的任何东西。另外,服务器应该已经知道如何做它需要做的事情;通常你要做的就是发送一个命令(一个字符串)告诉它使用那个函数(它已经有了,因此你可以相信)。

但是,如果你想继续这样做:

  

不转换为字符串。

你不能。唯一的方法是将函数作为源代码或其他可以通过HTTP发送的形式发送,这最终是基于文本的协议。因此,您要发送源代码,或者将其编译为您自己设计的某种字节码,然后发送(转换为字符串,可能是Base64或类似字符串)等。

从ES2015开始,正常函数需要toString采用有效函数声明或表达式的形式,因此您可以发送该字符串:

var dataToSend = {prop: data.prop.toString()};
ajax(..., data: JSON.stringify(dataToSend), dataType: "json")

然后服务器必须编译该字符串并执行结果。 JavaScript提供了一种方法(eval),但又是:非常危险来执行从客户端收到的代码。做非常危险的事情需要先做很多安全检查。

答案 1 :(得分:0)

当前的JavaScript版本,即< ES2015本身并不支持使用JSON.stringify()或类似功能,但是如果你使用NPM或其他软件包管理器来安装模块,你可以安装一个软件包。

这个包名为serialize-javascript,它添加了一个serialize函数,可用于将函数,正则表达式等转换为字符串表示形式。然后,您可以在服务器端使用eval