问题 有人在nsf中使用javascript原型后如何在Domino服务器中清理SSJS?


如果有人在nsf中使用javascript原型,如何在Domino服务器中清理SSJS(服务器端Javascript)?

马克罗登发现了一个 巨大的弱点 在XPage SSJS :(感谢David Leedy告诉我这个并向我展示这篇文章)。

如果您有以下SSJS代码:

var dummyObj = {}
dummyObj.prototype.NAME = "Johann"

XPages SSJS并不关心你使用 VAR (var表示变量必须是本地的)并且它是 dummyObj.NAME 在整个服务器中可以看到值 约翰。因此,如果同一服务器中的另一个nsf使用具有相同名称的var,则它将继承整个原型:

var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */ 

这是一个巨大的错误(一个使得不可靠的XPage SSJS IMO)。即使你根本不使用原型,如果他的应用程序中的其他人做了类似这样的事情:

String.prototype.split = function(){ return "I broke this method" }

它将破坏使用无辜者的同一服务器中的所有应用程序 分裂()

所以,问题是:如果有人“错误地”在NSF中写下以下SSJS(XPages服务器端Javascript):

String.prototype.split = function(){ return "I broke this method" }

如何将String.prototype.split()修复为原始值?

正如Mark Roden所说,重启HTTP任务并不能解决问题。

////////////////////////////////////////////////// /////////

编辑1:为什么我认为这是一个巨大的错误:

我是Javascript粉丝但IMHO @MarkyRoden在SSJS中发现了一个巨大的错误。垫片和填充物实际上不是主要问题。已知Eval是一种不好的做法,但原型对象是基本Javascript的基本元素。这是向Javascript类添加方法的标准和首选方法,它也需要继承和各种类型 OOP的东西。因此,您需要在服务器级别使用某种命名空间以避免冲突。所有这些都非常糟糕,但最大的问题是,一个应用程序中的一行代码可能会破坏服务器中的所有应用程序。是的,您可以信任您的开发人员,但其中一个人可能会错误地编写错误的行,并且Domino服务器可以拥有来自不同软件供应商的数百个应用程序。在代码审查中设置责任不是一个可靠的程序。也许是时候在SSJS中拥有一个真正的javascript引擎,比如V8,Spidermonkey,Chakra或Rhino。作为一种解决方法,我正在想像Tommy Valand这样的东西 与SSJS中的犀牛的想法

编辑2:情况更糟。你可以这样做:

prototype.importPackage = null

要么

prototype.Array = null

正如你在@SvenHasselbach的文章中看到的那样: http://hasselba.ch/blog/?p=1371

编辑3:IBM:你告诉我我可以使用SSJS。来吧!请修复它,它是AWFUL。请让我们正式向IBM报告此问题。


4867
2017-11-02 02:30


起源

关于你的编辑评论。我认为关键的一点是SSJS不是“真正的JavaScript”。因此,您需要相应地管理您对SSJS的期望。尤其是OOP。你不能在SSJS中真正做对象。如果您将代码放入函数中,那么它们就不是可序列化的。老实说,我认为真正的解决方法是使用Java而不是SSJS。 - David Leedy
这是在XPages开发中使用尽可能多的Java和EL而不是SSJS的另一个原因。 - Knut Herrmann
我同意克努特和大卫的观点。还要考虑几年前Jesse Gallagher所做的事情,使您能够在XPage中编写Ruby代码:XPages是一个基于JSF的平台,在Java虚拟机中运行,因此为了让人们能够编写Ruby代码,Jesse必须编写一个解析引擎来允许用Java来解析Ruby。 Rhino解析器正在做同样的事情 - 它使用Java类来告诉Java如何解析Rhino。因此,除非我误解了一些事情,否则你不能在SSJS中拥有真正的javascript引擎,因为你将为该javascript引擎使用Java解析器。调试也可能是一个挑战。 - Paul Stephen Withers
我强烈反对任何试图使用String.prototype修复核心API(JavaScript或Java)缺陷的人。有许多Java类旨在在Java中添加缺少的功能(以及SSJS)。 com.ibm.commons.util.StringUtil是内置的XPages。通过一些变通办法,您可以添加org.apache.commons.lang.StringUtils intec.co.uk/two-java-libraries-to-know-for-xpages-development。 importPackage()允许您使用SSJS中的任何Java类,只要服务器可以访问它。 - Paul Stephen Withers


答案:


您可以使用以下Java代码重置SSJS解释器:

FacesContextExImpl fc = (FacesContextExImpl) FacesContextExImpl.getCurrentInstance();
UIViewRootEx2 uiRoot = (UIViewRootEx2) fc.getViewRoot();
JSContext jsContext = uiRoot.getJSInterpreter().getJSContext();
jsContext.getRegistry().init(jsContext);

这将重新初始化注册表和所有原型函数。

编辑: 改变了声明 FC 到正确的类型。

编辑2:这是SSJS版本:

var uiRoot = facesContext.getViewRoot();
var jsContext = uiRoot.getJSInterpreter().getJSContext();
var reg = jsContext.getRegistry();
reg.init( jsContext );

我是否理解正确,您希望清理SSJS解释器以避免与您自己的碰撞 原型 延期? 只是为了澄清上面的答案:这一次重新初始化了SSJS解释器。而且只有一次。 您必须反复执行此操作,因为在重新初始化之后,服务器上的另一个应用程序可以再次覆盖原型功能。这就是为什么这不是一个真正的解决方案,它是你最初问题的答案。

如果另一个应用程序在您的代码尝试使用您的扩展程序时也会执行相同操作,则会产生相互影响...


8
2017-11-03 14:36



实际上,它会以重启http任务的方式影响每个应用程序。 IMO代码审查是避免问题的唯一安全方法(我不希望IBM很快修复它 - 没有SPR,没有修复)。 - Frantisek Kossuth
@FrantisekKossuth:不,这可以在运行时完成。重新启动服务器时,一切都会丢失(会话数据,身份验证等)。但为了安全起见,这必须一次又一次地完成。真正防止问题的唯一方法是不使用SSJS。 - Sven Hasselbach
你是对的,重启将擦除更多的数据。我的观点是:应用程序可能会松散存储在上下文中的“状态”并以相同的方式发生故障 - Frantisek Kossuth
@FrantisekKossuth:你对“背景”是什么意思? Scoped变量等不受影响...... - Sven Hasselbach
@Sven很好!这可能是一个很好的解决方法。我想在我的SSJS pollyfills上使用你的代码: gist.github.com/katio/08bf3f5e058b950cd957。我试过了: importPackage( com.ibm.xsp.context);  var fc:FacesContext = FacesContextExImpl.getCurrentInstance();  var uiRoot:UIViewRootEx2 = fc.getViewRoot();  var jsContext:JSContext = uiRoot.getJSInterpreter().getJSContext();  jsContext.getRegistry().init(jsContext); 但我收到错误:“脚本解释器错误,行= 2,col = 28:调用getCurrentInstance()和getCurrentInstance()时出现歧义”。我输入正确的包裹吗? - Johann Echavarria


尝试重新启动任务Http 告诉http restart不会完全重启http任务


3
2017-11-02 11:48



重启任务Http清理所有原型。尼斯!但是当再次执行带有坏原型代码的错误应用程序时该怎么办?如何保护我的XPage应用程序不受此影响?我很担心这个。这是一个巨大的错误。 IBM真的应该修复它。如果没有解决方案,那么任何人都可以继续信任XPage SSJS? - Johann Echavarria
这不是一个错误恕我直言,这是SSJS实施方式的一个不幸的特点。我相信SSJS,开发人员并非如此。所以我不鼓励你使用垫片,不鼓励别人使用原型我害怕 - 对不起:( - MarkyRoden
@JohannEchavarria:你不能相信SSJS。出于安全原因,在查看它时会被设计破坏。但这并不意味着你不能在“可信环境”中使用它:管理员必须查看坏片段,并且必须拍摄覆盖内部函数的开发人员(它不仅仅是“原型”事物)。使用“eval”也是一种禁忌。 - Sven Hasselbach
@MarkyRoden&Sven:我编辑了我的问题并添加了为什么我认为这是一个巨大的错误。 - Johann Echavarria
管理员怎么能真正发现某人正在使用“原型”?他们应该为此专门进行代码扫描吗?我将在这里发表意见,并建议这可能是更喜欢Java而不是SSJS for XPages Business Logic的另一个好理由.... - David Leedy