KevinK.dev.js/content/blog/general/001-free-pizza.mdx
2022-02-13 18:34:38 +00:00

76 lines
3.8 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
section: general
language: de
title: "Never trust user input: Gratis Pizza"
url: never-trust-user-input
tags: [security]
published: 2018-03-10 22:00:00
author:
name: Kevin Kandlbinder
embeddedImagesLocal:
- "./assets/001-free-pizza/firefox_2018-03-10_11-51-08-e1520680515546.png"
---
import { getImage, GatsbyImage } from "gatsby-plugin-image";
> „Never trust user input“
Diese einfache Regel der Web-Sicherheit sollte jeder Web-Entwickler schon mal gehört haben, doch trotzdem gibt es noch immer viele Entwickler, die sich nicht genug darum kümmern und genau das wird vielen Seiten zum Verhängnis.
## Das Casino
Als ich mir vor kurzem Sushi auf [Pizza.de](https://web.archive.org/web/20180303184257/https://pizza.de/) (Ja, ich sehe den Wiederspruch) bestellt habe wurde mir auf der Bestellbestätigungs-Seite Werbung für das so genannte [Pizza.de-Casino](https://web.archive.org/web/20180306155955/https://pizza.de/casino/) angezeigt. Da ich eh auf meine Bestellung warten musste und man nichts beahlen muss dachte ich mir, dass man das ja mal probieren kann.
![Wie gespielt werden soll...](./assets/001-free-pizza/2018-03-10_11-49-12.gif)
Nach 9 von 10 täglichen Versuchen war ich schließlich frustriert: „Es muss doch irgend einen anderen Weg geben…“ Also habe ich mir die Netzwerkaktivität wärend des Spielens angesehen: Eine Anfrage an Facebook und eine an Google, beides Analytics. Folglich muss mein eigener Browser berechnen, ob ich gewonnen habe oder nicht.
## Der Code
Nachdem ich das sah war die Challenge nicht mehr zu ignorieren: ICH WILL GEWINNEN!
Also habe ich mich durch den Code gewühlt und mir fielen mehrere Variablen auf, die offensichtlich für die Gewinnchancen zuständig sind. (Fun Fact: Die Chance beim ersten Versuch ist größer als bei allen weiteren) Als ich aber mit denen ein bisschen ohne Ergebnis rumgespielt habe, habe ich mich direkt in die Funktionen gesetzt und nachvollzogen was das Programm genau macht wenn ich den Button drücke, und da war es: In Zeile 203
fand sich die Funktion „win“…
<div>
<GatsbyImage alt="win();" image={getImage(props.localImages[0])} />
</div>
Aber das kann doch nicht funktionieren… Die Web-Sicherheit…
## Der Test
Also nichts wie ab damit in die Konsole und…
<div style="display: flex; align-items: center; gap: 20px;">
<img
src="./assets/001-free-pizza/2018-03-10_11-52-49.gif"
alt="Konsole"
width="50%"
/>
<img
src="./assets/001-free-pizza/2018-03-10_11-52-01.gif"
alt="Casino"
width="50%"
/>
</div>
…gewonnen, der Code war besiegt, die Challenge gemeistert, die Web-Sicherheit im A\*\*\*\* und ich zufrieden. Toll. Aber was nun? Sich ganz viele Gutscheine auf Prepaid-Nummern holen? Zu anstrengend. Pizza.de Bescheid sagen? Ja, aber nicht genug… Darüber schreiben und eine Moral für jeden Entwickler draus ziehen? Ja, das klingt gut!
## Die Moral von der Geschicht...
**...User-Input trauen tut man nicht.** Selbst große Firmen mit gut bezahlten Entwicklern machen diesen Fehler: Die Performance der Seite wird auf Kosten der Sicherheit verbessert und dem Browser des Benutzers wird blind vertraut. Doch wie kann man so etwas lösen?
Das Casino sollte im Hintergrund seine Ergebnisse auf dem Server generieren, auch wenn es eine kurze Ladezeit gäbe und vom Server einen Token bekommen, mit dem der Gewinn abgeholt werden könnte. Somit würde der Server entscheiden ob ein Gutschein herausgegeben wird und nicht ein hobbyloser Typ mit einem PC.
<small>
Importiert aus altem Blog -{" "}
<a
href="https://web.archive.org/web/20201216152631/https://blog.1in9.net/2018/03/never-trust-user-input-gratis-pizza/"
target="_blank"
rel="noreferrer "
>
Archiviertes Original
</a>
</small>