mini|Logo JSONP (JSON mit Padding) auch JSON-P ist eine JavaScript-Technik für den Datenzugriff bei dem JSON-Daten über ein <script>-Element eingebunden und inklusive eines Funktionsaufrufs ausgegeben wird. Dies ermöglicht die Übertragung von über Domaingrenzen, ist jedoch mit Sicherheitsrisiken behaftet.

JSONP wurde 2005 von Bob Ippolito vorgestellt und wird jetzt von vielen Web-2.0-Anwendungen wie Dojo Toolkit, jQuery, Google Web Toolkit Applications und Web Services unterstützt. Für dieses Protokoll wurden Erweiterungen vorgeschlagen, die zusätzliche Eingabeparameter ermöglichen, wie z. B. JSONPP.

Funktionsweise Üblicherweise erfolgen Ajax-Datenabfragen an Server über das XMLHttpRequest-Objekt eines Webbrowsers. Aufgrund der Same-Origin-Policy funktioniert das nicht, wenn die in einem Webbrowser angezeigte Webseite über dieses Objekt auf einen Server zuzugreifen versucht, der in einer anderen Domain als die angezeigte Webseite liegt. Das Problem kann durch JSONP umgangen werden. Im src-Attribut eines <script>-Elements ist es möglich, beliebige URLs anzugeben. Für dieses Attribut greift die Same-Origin-Policy nicht. Es ist also möglich, eine URL in einer anderen Domain anzugeben, die beispielsweise JSON-Daten zurückgibt. Dieses Script hätte aber keinen Effekt.

Um die JSON-Daten auf dem Client verarbeiten zu können, verpackt der Server diese als Parameter in eine JavaScript-Funktion, die im Webbrowser bereits definiert ist. Der Name dieser Funktion wird dem Server üblicherweise im Query-String der URL mitgeteilt, wobei das genaue Format oder der Name des Parameters nicht genormt ist.

Beispiel

Im HTML-Code einer Webseite werden die JSONP-Daten wie folgt eingebunden:

<script type="text/javascript" src="https://example.com/getjson?jsonp=exampleCallback"> </script>

Der Server erzeugt daraufhin einen JavaScript-Codeschnipsel, in dem die eigentlichen Daten an die genannte Funktion übergeben werden:

exampleCallback( {"name":"Jane Doe", "value":4711} );

Der Browser führt diesen Funktionsaufruf daraufhin aus, als ob er direkt in der HTML-Seite niedergeschrieben worden wäre, und kann so die JSON-Daten aus dem Aufruf verarbeiten.

Üblicherweise ist für jeden JSONP-Aufruf ein eigenes <script>-Element erforderlich.

Sicherheitsrisiken <script>-Elemente ermöglichen es einem Server, beliebige Inhalte (nicht nur JSON-Objekte) an den Webbrowser zu übermitteln. Dies kann dazu führen, dass ein bösartiger Web-Service über die zurückgesendeten Daten private Informationen im Webbrowser ausspäht oder in seinem Sinne verändert (Cross-Site-Scripting).

Da das <script>-Element die Same-Origin-Policy nicht beachtet, kann eine bösartige Webseite JSONP-Daten anfordern und auswerten, die nicht für sie bestimmt sind (Cross-Site-Request-Forgery). Das Problem tritt dann auf, wenn sensible Daten vor Dritten geschützt werden sollen.

Alternative Mit Cross-Origin Resource Sharing (CORS) existiert ein vergleichbares Verfahren, das den Zugriff über Domaingrenzen hinweg ermöglicht, ohne jedoch der abgefragten Ressource die Möglichkeit einzuräumen, beliebigen JavaScript-Code auszuführen. Beide Verfahren erfordern die Unterstützung durch die entsprechende Ressource, wobei CORS einfacher zu implementieren ist. Gleichzeitig erlaubt CORS eine einfache Einschränkung seitens der Ressource, von welchen Datenquellen (englisch „origins“, das sind URLs, Domänen o. ä.) sie genutzt werden kann.

CORS ist gegenüber JSONP meist zu bevorzugen, da CORS insgesamt einfacher und sicherer ist.

Weblinks jsonp.eu – Erklärungen und Programmierbeispiele zu JSON with Padding (JSONP)

Einzelnachweise

Kategorie:Web-Entwicklung Kategorie:Abkürzung Kategorie:JSON