Как очистить SSJS (серверный Javascript) на сервере Domino после того, как кто-то использовал прототип javascript в nsf?
Марк Роден обнаружил огромную слабость в XPages SSJS: (спасибо Дэвиду Леди за рассказ об этом и покажу мне статью).Если у вас есть следующий код SSJS:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
XPages SSJS не заботится о том, чтобы вы использовали var (var означает, что переменная должна быть локальной) и она отображает dummyObj.NAME на весь сервер со значением Johann. Поэтому, если другой nsf на одном сервере использует var с тем же именем, он наследует весь прототип:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
Это огромный баг (тот, который делает ненадежным XPages SSJS IMO). Даже если вы не используете прототип вообще, если кто-то еще в его приложении сделает что-то вроде этого:
String.prototype.split = function(){ return "I broke this method" }
Он сломает все приложения на том же сервере, который использует невинную split().
Итак, вопрос: если кто-то "по ошибке" записывает следующий SSJS (XPages Server Side Javascript) в NSF:
String.prototype.split = function(){ return "I broke this method" }
Как я могу исправить String.prototype.split() до его первоначального значения?
Как сказал Марк Роден, перезапуск HTTP-задачи не исправляет его.
///////////////////////////////////////////////////////////
Изменить 1: Почему я думаю, что это огромная ошибка:
Я поклонник Javascript, но IMHO @MarkyRoden обнаружил огромную ошибку в SSJS. Прокладки и полисы не являются главной проблемой. Известно, что Eval является плохой практикой, но объект-прототип является фундаментальным элементом базового Javascript. Это стандартный и предпочтительный способ добавления методов в классы Javascript, он также необходим для наследования и всех видов материала OOP. Таким образом, вам нужно какое-то пространство имен на уровне сервера, чтобы избежать столкновений. Все это очень плохо, но огромная проблема заключается в том, что только строка кода в одном приложении может сломать все приложения на сервере. Да, вы можете доверять своим разработчикам, но один из них может ошибочно писать плохую строку, а также сервер Domino может иметь сотни приложений от разных поставщиков программного обеспечения. Установить ответственность в обзорах кода не является достаточно надежной процедурой. Возможно, пришло время иметь настоящий механизм JavaScript в SSJS, например V8, Spidermonkey, Chakra или Rhino. В качестве обходного решения я думаю о чем-то вроде идеи с Rhino в SSJS.
Изменить 2: Это еще хуже. Вы можете делать такие вещи, как:
prototype.importPackage = null
или
prototype.Array = null
Как вы можете видеть в статье @SvenHasselbach: http://hasselba.ch/blog/?p=1371
Изменить 3: IBM: вы сказали мне, что я могу использовать SSJS. ПРИХОДИТЕ ОДИН! ПОЖАЛУЙСТА, ПОЛУЧАЙТЕ ЭТО, это AWFUL. Просим официально сообщить об этом IBM.