Bezpieczny JSON w praktyce

JavaScript Object Notation (JSON) stał się powszechnie wykorzystywanym formatem wymiany danych pomiędzy dynamicznymi aplikacjami tworzonymi w JavaScript. Równocześnie publikuje się coraz więcej ataków wykorzystujących JSON jako nośnik złośliwych treści. Powód to przede wszystkim nonszalanckie parsowanie bloków JSON po stronie aplikacji.

Prawdopodobnie najpopularniejszą metodą zamiany bloku JSON na zmienną JavaScript jest metoda eval(). Problem z metodą eval() polega na tym, że po prostu wykonuje ona kod JavaScript zaś całe wykorzystanie go dekodowania JSON opiera się na optymistycznym założeniu, że dane wejściowe będą zawierać tylko blok JSON i nic poza tym. Innymi słowy, jeśli ładujemy blok JSON, co do którego pochodzenia jesteśmy w 100% pewni (bo np. jest to nasza własna usługa webowa ładowana po HTTPS), to funkcja eval() ma jedną zasadniczą zaletę - jest nią szybkość. W każdym innym przypadku właściwym rozwiązaniem będzie korzystanie z parsera JSON.

Parser JSON to kod - w tym przypadku również napisany w JavaScript - który interpretuje wyłącznie struktury JSON i nic poza tym. Oznacza to w praktyce, że parser ochroni użytkowników naszej aplikacji jeśli ktoś włamie się na zewnętrzny serwer, z którego danych korzystamy, lub zostanie przejęta jego domena, lub zdarzy się szereg innych możliwych scenariuszy prowadzących do zastąpienia niewinnego JSON złośliwym kodem JavaScript.

  • http://www.json.org/json_parse.js Jest to bezpieczny parser walidujący, który na wyjściu przepuści wyłącznie dane stanowiące poprawny kod JSON. Może on być relatywnie wolny w przypadku dużych blokód JSON.

  • http://code.google.com/p/json-sans-eval/ Szybki, nie walidujący parses pisany pod kątem praktycznego bezpieczeństwa. W praktyce, według zapewnień autorów, oznacza to, że parser może zwracać kod niepoprawny pod względem składniowym (jeśli taki pojawi się na wejściu), ale nie będzie to aktywny kod JavaScript. Parser ten nie używa eval().

  • http://json.org/js.html Metoda JSON.parse() stanowi część nowej specyfikacji ECMA Script i w przyszłości stanowić będzie zapewne szybką i bezpieczną alternatywę dla wyżej wymienionych parserów. Odnotowujemy ją, bo jest ona już obecnie implementowana przez nowe wersje niektórych przeglądarek.

Inną nowością, wprowadzoną po raz pierwszy przez MSIE 8 jest metoda toStaticHTML. Jest to zaimplementowany po stronie przeglądarki i dostępny z poziomu JavaScript bezpieczny walidator kodu HTML, stanowiący odpowiednik serwerowej biblioteki Anti-XSS. Możliwe jego zastosowania są niewątpliwie znacznie szersze niż ochrona JSON, ale może on stanowić doskonałe uzupełnienie dla szybkiego parsera. Aktualny stan implementacji tego typu funkcji bezpieczeństwa można sprawdzić na stronie Browser Scope, a tymczasem w aplikacjach przeznaczonych dla szerokiej publiczności do podobnego celu można wykorzystać JsHtmlSanitizer.

W celu komercyjnej reprodukcji treści Computerworld należy zakupić licencję. Skontaktuj się z naszym partnerem, YGS Group, pod adresem [email protected]

TOP 200