Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我不能运行数据库中的JS吗?_Java_Javascript_Mongodb_Nashorn - Fatal编程技术网

Java 为什么可以';我不能运行数据库中的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

我需要运行一个在mongoDB中以字符串格式保存的JS命令。为什么不运行大写的数据

爪哇

数据库

{
    "_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