根据我对NodeJS / Javascript如何工作的了解,我相信这是有可能的。是吗?
我希望能够基于http请求向客户端发送函数,如下所示(伪短代码):
// Server
server.get("/function",()=>{
return function () => {
console.log('test)
}
// client
request ("server/function",(res)=>{
func = res.body
func()
// # result
// test
我试图转换为字符串以从服务器发送函数并转换回客户端上的对象,但是它返回的错误我无法理解,为什么我好像发送一个简单的键值json对象一样有效
// server
const http = require('http');
const port = 3000;
const hostname = '127.0.0.1';
const server = http.createServer((req, res) => {
if (req.url === '/function') {
res.statusCode = 200;
function func () {
console.log('test')
}
res.end(func.toString())
}
});
server.listen(3000)
// client
const http = require('http');
const httpGet = url => {
return new Promise((resolve, reject) => {
http.get(url, res => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => resolve(body));
}).on('error', reject);
});
};
const call = async () => {
const body = await httpGet('http://localhost:3000/function')
console.log(`${body}`)
func = JSON.parse(body) // try to redefine function based on the response
}
const func = () => {
console.log('before')
}
func() // run the func defined here
call()
func() // run the function got from the request?
这个想法是让一个客户端能够执行几乎任何代码,而无需更新客户端本身。
答案 0 :(得分:1)
我不确定您为什么要这样做,这确实不安全,并且您不应该具有执行此操作的Web应用程序。但是这里:
假设您有一个功能:
await _auth.signInWithEmailAndPassword(email: email, password: password);
并作为字符串:
function test() {
console.log("test")
}
您需要首先获取函数主体:
const funcString = test.toString()
// ^ is now "function test() {\n console.log(\"test\")\n }"
然后从中创建一个函数:
const funcBody = funcString.replace(/^[^{]+{/, '').replace(/}[^}]*$/, '')
// ^ is now "console.log(\"test\")"
现在,如果您拨打const newTest = Function(funcBody)
,您将在控制台中看到newTest()
的打印内容。
请注意,我用来获取函数主体的正则表达式不适用于所有函数。例如,对于test
,您将需要其他正则表达式。
答案 1 :(得分:0)
我不确定这是最好的主意。
从历史上看,您描述的客户端与服务器之间的关系是通过remote procedure calls反转的,其中客户端将调用远程服务器上的特定端点。听起来,使客户端任意执行代码的最大吸引力在于,无需更新客户端代码。如果要对服务器代码进行向后不兼容的更改会怎样?我认为使用版本化的API终结点基于客户端逻辑在服务器端执行代码会取得更好的成功,您会在npm内找到许多RPC和/或REST框架。
想法是让一个客户端能够执行几乎任何代码,而无需更新客户端本身。
最后要记住的一件事是安全性。如果我找到您的客户端并替换了我的恶意JavaScript,该怎么办?