是否有可能通过节点/express的REST API返回javascript函数?



我有一个独特的用例,我想向端点发出GET请求并返回一个javascript函数作为响应。我目前使用node.js与express,但开放给其他框架。

所以在服务器端,如果客户端请求获得"添加"的函数。

我希望服务器发送一个函数作为响应,看起来像这样:

function add(num1, num2){
return num1 + num2
} 

客户端可以接收响应并使用该函数。如:

axios(config).then(response=>{
myfunction = response
return myfunction(1,5)
//returns 6
})

是否有一种方法可以在服务器端"序列化"函数并将其转换为客户端实际的函数?

无论你做什么,你最终都会得到一个你需要在客户端eval的代码,所以你总是会冒XSS的风险,你需要确保它们不包含危险的代码。从REST的角度来看,这不是一个大问题,你只需要返回具有application/javascriptMIME类型的javascript代码,你可以用SCRIPT标签将其添加到DOM中,或者只是使用evalnew Function

function add(a, b){
return a+b;
}

从安全的角度来看,如果您的用户可以上传这些功能的全部或部分,这可能会更有问题。如果是这种情况,那么您需要将函数代码转换为服务器上的数据格式,并对其进行处理,以确保在客户机中使用它是安全的。例如,你可以只允许+-*/这样的操作符,你可以只允许访问局部变量。数据格式可以是这样的:

{
function: "add",
params: ["a", "b"],
code: [
{
"return": {"+": ["a", "b"]}
}
]
}

或者你可以使用已经存在的格式,比如javascript AST.这里有一些工具可以用来处理这种格式:https://github.com/search?l=JavaScript&q=ECMAScript+AST&type=Repositories

{
"type": "Program",
"start": 0,
"end": 32,
"body": [
{
"type": "FunctionDeclaration",
"start": 0,
"end": 32,
"id": {
"type": "Identifier",
"start": 9,
"end": 12,
"name": "add"
},
"expression": false,
"generator": false,
"async": false,
"params": [
{
"type": "Identifier",
"start": 13,
"end": 14,
"name": "a"
},
{
"type": "Identifier",
"start": 15,
"end": 16,
"name": "b"
}
],
"body": {
"type": "BlockStatement",
"start": 17,
"end": 32,
"body": [
{
"type": "ReturnStatement",
"start": 19,
"end": 30,
"argument": {
"type": "BinaryExpression",
"start": 26,
"end": 29,
"left": {
"type": "Identifier",
"start": 26,
"end": 27,
"name": "a"
},
"operator": "+",
"right": {
"type": "Identifier",
"start": 28,
"end": 29,
"name": "b"
}
}
}
]
}
}
],
"sourceType": "module"
}

如果您担心您的数据库包含不安全的函数,或者它可以被攻击者修改以分发不安全的函数,那么最好在将它们发送给客户端之前再次验证它们。

最新更新