2014-11-02 8 views
11

Jak wyczyścić SSJS (JavaScript po stronie serwera) w serwerze Domino po tym, jak ktoś użył prototypu javascript w pliku nsf?Jak wyczyścić SSJS na serwerze Domino po tym, jak ktoś użył prototypu javascript w nsf?

Mark Roden odkrył huge weakness w XPages SSJS: (podziękowania dla Davida Leedy'ego za opowiadanie mi o tym i pokazanie mi artykułu).

Jeśli masz następujący kod SSJS:

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

XPages SSJS nie obchodzi, że używa var (var oznacza zmienna musi być lokalna) i to sprawia dummyObj.NAME widoczne w cały serwer o wartości Johann. Więc jeśli inny NSF w tym samym serwerze używa var o tej samej nazwie dziedziczy cały prototype:

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

To ogromny błąd (taki, który sprawia, że ​​nierzetelne XPages SSJS IMO). Nawet jeśli nie używasz prototyp w ogóle, jeśli ktoś w swoim wniosku zrobić coś takiego:

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

Będzie on złamał wszystkie aplikacje w tym samym serwerze, który korzysta z niewinną split().

Więc pytanie brzmi: czy ktoś "przez pomyłkę" pisze następujące SSJS (XPages Server Side JavaScript) w NSF:

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

Jak można naprawić String.prototype.split(), aby jego oryginalna wartość?

Jak powiedział Mark Roden, ponowne uruchomienie zadania HTTP nie naprawić.

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

Edit 1: Dlaczego myślę, że jest to ogromny błąd:

Jestem fanem Javascript ale IMHO @MarkyRoden odkrył ogromny błąd w SSJS . Podkładki i polyfills nie są tak naprawdę głównym problemem. Eval jest złą praktyką, ale prototypowy obiekt jest podstawowym elementem podstawowego Javascriptu. Jest to standardowy i preferowany sposób dodawania metod do klas JavaScript, jest również potrzebny do dziedziczenia i wszelkiego rodzaju OOP stuff. Potrzebujesz więc przestrzeni nazw na poziomie serwera, aby uniknąć kolizji. Wszystko to jest naprawdę złe, ale ogromnym problemem jest to, że linia kodu w jednej aplikacji może zepsuć wszystkie aplikacje na serwerze. Tak, możesz ufać swoim programistom, ale jeden z nich może przez pomyłkę napisać błędną linię, a także serwer Domino może mieć setki aplikacji od różnych dostawców oprogramowania. Ustalenie odpowiedzialności w przeglądach kodu nie jest niezawodną procedurą. Być może nadszedł czas, aby mieć prawdziwy silnik javascript w SSJS, taki jak V8, Spidermonkey, Chakra lub Rhino. Jako obejście, myślę w czymś takim jak Tommy Valand's idea with Rhino in SSJS.

Edit 2: Jest jeszcze gorzej.Można robić takie rzeczy jak:

prototype.importPackage = null 

lub

prototype.Array = null 

Jak widać w @ SvenHasselbach w artykule: http://hasselba.ch/blog/?p=1371

Edycja 3: IBM: Powiedziałeś mi, że mogę korzystać z SSJS. PRZYJDŹ JEDEN! PROSZĘ USUNĄĆ TEN, to jest PIĘKNE. Oficjalnie zgłoś ten problem IBM.

+1

chodzi komentarze edytować. Myślę, że kluczowe jest to, że SSJS NIE jest "prawdziwym JavaScript". Musisz więc odpowiednio zarządzać swoimi oczekiwaniami SSJS. Zwłaszcza z OOP. Naprawdę nie możesz robić obiektów w SSJS. Jeśli umieścisz kod w swoich funkcjach, nie będzie można ich edytować w Serializacji. Szczerze wierzę, że prawdziwym rozwiązaniem jest użycie Java zamiast SSJS. –

+0

To jeszcze jeden powód, dla którego używasz jak najwięcej Java i EL w rozwoju XPages zamiast SSJS. –

+0

Zgadzam się z Knutem i Davidem. Zastanów się także, co Jesse Gallagher zrobił kilka lat temu, aby umożliwić ci kodowanie Ruby w XPages: XPages jest platformą opartą na JSF, działającą w wirtualnej maszynie Java, więc aby umożliwić ludziom kodowanie Ruby, Jesse musiał napisać mechanizm analizowania, aby umożliwić Java do parsowania Ruby. Parser Rhino robi to samo - używa klasy Java, aby powiedzieć Java, jak parsować Rhino. Więc jeśli nie rozumiem rzeczy, nie możesz mieć prawdziwego silnika javascript w SSJS, ponieważ będziesz używał parsera Java dla tego silnika javascript. Debugowanie może być również wyzwaniem. –

Odpowiedz

8

Można zresetować tłumacza SSJS z następującego kodu Java:

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

ten ponownie inicjuje rejestr i wszystkie funkcje prototypowe.

EDYCJA: Zmieniono deklarację fc na właściwy typ.

EDIT 2: Oto wersja SSJS:

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

Czy Rozumiem Cię słusznie, że chcesz oczyścić tłumacza SSJS aby uniknąć kolizji z własnej prototypu rozszerzenie? Aby wyjaśnić powyższą odpowiedź: To ponownie inicjuje tłumacza SSJS. I tylko raz. Musisz to robić wielokrotnie, ponieważ bezpośrednio po ponownym inicjalizacji, inna aplikacja na serwerze może ponownie nadpisać prototypową funkcjonalność. Dlatego nie jest to prawdziwe rozwiązanie, jest to odpowiedź na twoje pierwsze pytanie.

Będzie miał interessting konsekwencje, jeśli inna aplikacja zrobi to samo natomiast kod spróbuje użyć rozszerzenia ...

+0

W rzeczywistości wpłynie to na każdą aplikację w ten sam sposób, co ponowne uruchamianie zadania http. Przegląd kodu IMO jest jedynym bezpiecznym sposobem na uniknięcie problemu (nie spodziewam się, że IBM go naprawi w najbliższym czasie - bez SPR, bez poprawki). –

+0

@FrantisekKossuth: Nie, można to zrobić podczas uruchamiania. Po zrestartowaniu serwera wszystko zostaje utracone (dane sesji, uwierzytelnianie itp.). Ale aby być bezpiecznym, trzeba to robić w kółko. Jedynym sposobem, który naprawdę zapobiega problemom, nie jest używanie SSJS. –

+0

Masz rację, uruchom ponownie, wyczyści znacznie więcej danych. Chodzi mi o to, że aplikacja może utracić "stan" przechowywany w kontekście i wadliwie działać w ten sam sposób. –

3

spróbować zrobić restart zadań ciąg http zamiast powiedzieć http restart nie zrobi pełny restart zadania http

+1

Zrestartuj zadanie Http czyści wszystkie prototypy. Miły!. Ale co zrobić, gdy zła aplikacja ze złym prototypowym kodem zostanie ponownie wykonana? Jak mogę chronić moją aplikację XPage przed tym? Bardzo się o to martwię. To ogromny błąd. IBM naprawdę powinien to naprawić. Jeśli nie ma na to rozwiązania, jak można komuś zaufać w XPages SSJS? –

+0

To nie jest błąd IMHO to niefortunna cecha sposobu, w jaki SSJS jest zaimplementowany. Ufam SSJS, programiści nie. Więc zniechęciłbym cię do korzystania z podkładki i nie zachęcam innych do używania prototypu, obawiam się - przepraszam :( – MarkyRoden

+0

@JohannEchavarria: Nie możesz zaufać SSJS, ponieważ projekt jest podważany, gdy patrzy się na niego ze względów bezpieczeństwa. nie oznacza, że ​​nie możesz go używać w "zaufanym środowisku": administratorzy muszą patrzeć na złe fragmenty i muszą strzelać do programistów, którzy nadpisują funkcje wewnętrzne (jest czymś więcej niż tylko "prototypową" rzeczą). "eval" też nie jest. –

Powiązane problemy