[英]Send js function through AJAX
我想将“一个 javascript 函数”传递给我的后端,并且我正在使用 ajax。 这是一个简短的例子:
var data = {
prop: function (e) { alert(e) }
};
ajax.(..., data: data, dataType: "json")...
这会自动从数据中删除prop
,因为它是一个函数。
如何使用 json 将此函数传递给我的后端? 无需将其转换为字符串。
你真的不希望从客户端发送功能的服务器,并执行该功能的服务器上,并非没有很多的安全检查。 想一想,记住你不能相信从客户那里收到的任何东西。 另外,服务器应该已经知道如何做它需要做的事情; 通常你会做的是发送一个命令(一个字符串)告诉它使用那个函数(它已经有了,因此你可以信任)。
但是,如果你想继续这样做:
无需转换为字符串。
你不能。 唯一的方法是将函数作为源代码或可以通过 HTTP 发送的其他形式发送,HTTP 最终是基于文本的协议。 因此,您可以发送源代码,或者将其编译为您自己设计的某种字节码,然后发送(转换为字符串,可能是 Base64 或类似的字符串)等。
从 ES2015 开始,普通函数需要有一个采用有效函数声明或表达式形式的toString
,因此您可以发送该字符串:
var dataToSend = {prop: data.prop.toString()};
ajax(..., data: JSON.stringify(dataToSend), dataType: "json")
然后服务器必须编译该字符串并执行结果。 JavaScript 提供了一种方法来做到这一点( eval
),但同样:执行从客户端收到的代码是非常危险的。 做非常危险的事情需要先做很多安全检查。
当前的 JavaScript 版本,即 < ES2015 本身并不通过使用JSON.stringify()
或类似的函数来支持这一点,尽管如果您使用 NPM 或其他模块包管理器,您可以安装一个包。
这个包叫做serialize-javascript
,它添加了一个serialize
函数,你可以用它来将函数、正则表达式等转换为字符串表示。 然后您可以在服务器端使用eval
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.