Niewłaściwy encoding #5

Pora na zakończenie tematu przykładu z niewłaściwym encodingiem (patrz: #1, #2, #3 i #4). Ponownie, by nie przeciągać, dla tradycyjnego zestawu znaków testowych otrzymujemy:

Czy można tu coś zepsuć?

Na pierwszy rzut oka, wydaje się, że wszystko jest w porządku. Dane przekazane przez użytkownika są wstawiane w kontekście tagu

W kodzie strony wygląda to w sposób następujący (dla pierwszego przypadku):

');

Pozornie wszystko jest w porządku, dane przekazane przez użytkownika znajdują się wewnątrz łańcucha znaków w kontekście JavaScript. Tylko przeglądarka ma na ten temat nieco inne zdanie. Ona ten fragment kodu widzi w sposób następujący:

Parser HTML natrafiający na zamknięcie tagu script nie interesuje się specjalnie w jakim kontekście on wystąpił. Po prostu uznaje, że jest to koniec tagu. W oparciu o tę prostą sztuczkę można “uciec” z łańcucha znaków, w którym jesteśmy zamknięci przez zamianę znaku ' na \' i po prostu otworzyć nowy tag script, w którym można umieścić własny kod.

Tu warto zwrócić uwagę na drugi przypadek, który przeglądarka zrozumie następująco:

W tym wypadku przeglądarka nie natrafia na kończący tag script, więc opisany wyżej przypadek nie działa. No chyba, że ktoś znajdzie sposób na to, by przeglądarkę jednak oszukać. Jakieś pomysły?

Oryginał tego wpisu dostępny jest pod adresem Niewłaściwy encoding #5

Autor: Paweł Goleń