Java 为什么可以';我不能运行数据库中的JS吗?
我需要运行一个在mongoDB中以字符串格式保存的JS命令。为什么不运行大写的数据 爪哇 数据库Java 为什么可以';我不能运行数据库中的JS吗?,java,javascript,mongodb,nashorn,Java,Javascript,Mongodb,Nashorn,我需要运行一个在mongoDB中以字符串格式保存的JS命令。为什么不运行大写的数据 爪哇 数据库 { "_id" : ObjectId("55390277e230ebff4fe25755"), "atributo" : "peca_nome", "processador" : "function(val) { return val.toUpperCase(); }" } 执行engine.eval(“function(val){return val.toUpperCas
{
"_id" : ObjectId("55390277e230ebff4fe25755"),
"atributo" : "peca_nome",
"processador" : "function(val) { return val.toUpperCase(); }"
}
执行
engine.eval(“function(val){return val.toUpperCase();}”)
时,在脚本引擎的作用域中创建一个匿名函数。不幸的是,以后无法调用它,因为函数没有分配给变量
你的调用invocable.invokeFunction(“进程”,valor)
尝试调用函数进程(val)
,但脚本引擎的上下文中不存在具有该名称的函数。因此它抛出一个NoSuchMethodException
有两种可能的解决方案
重写数据库中的代码段,将函数分配给变量,以便以后调用:
{
"_id" : ObjectId("55390277e230ebff4fe25755"),
"atributo" : "peca_nome",
"processador" : "process = function(val) { return val.toUpperCase(); };"
}
或者,在编译脚本之前,使用Java将变量添加到Javascript源代码中:
engine.eval("process = " + processador);
顺便说一句:在数据库中存储可执行代码通常是一个非常危险的想法。当有任何方法可以将用户提供的数据放入这些代码片段时,您的应用程序就会面临危险的代码执行漏洞。默认情况下,nashorn脚本引擎根本不是沙盒,而且非常强大。它可以做JavaVM可以做的任何事情,包括从项目和java标准库调用任何方法或构造任何对象。你在这里所做的看起来像是要用装有子弹的枪玩杂耍。如果您知道自己在做什么,并且遵守了所有的安全预防措施,那么它可能是安全的,但看起来您只是要向自己(或其他人)开枪。您可以评估匿名函数并将结果存储为对象。结果对象的类型为ScriptObjectMirror(),它有一个调用()该函数的方法 代码是这样的
Object thiz = engine.eval("this"); // get you global object
ScriptObjectMirror func = engine.eval("function() { print('hello'); }");
func.call(thiz); // pass global object as "this" for the function
您是否打印出javascript以确保它不会在某处转义?当您运行代码时会发生什么,您希望它发生什么?我在
valor=(String)invocable.invokeFunction(“process”,valor)中有一个NoSuchMethodException
代码>我尝试在数据库中插入:函数进程(val){return val.toUpperCase();}
但保持不工作不工作=(但与{“\u id”:ObjectId(“55391f7681359593d7993844”),“atributo”:“peca_nome”,“processador”:“函数进程(val){return val.toUpperCase();}”
idk why./默认情况下,nashorn脚本引擎根本没有沙盒,而且功能非常强大。它可以执行JavaVM可以执行的任何操作,包括调用任何方法或构造任何对象…/这并不完全准确。如果java代码在运行时启用了安全管理器,则任何经过评估的JS代码都会使用null CodeSource=>代码运行作为不受信任的沙盒代码运行,因此不会获得任何特殊权限(如不受信任的小程序代码)。
Object thiz = engine.eval("this"); // get you global object
ScriptObjectMirror func = engine.eval("function() { print('hello'); }");
func.call(thiz); // pass global object as "this" for the function