Pamiętam, że mi tłuczono, że niezaufane stringi (czyli wszystkie przesyłane od userów do serwera) muszą koniecznie być walidowane i sanityzowane przed przesłaniem ich innym userom. Tyle, że jakoś tego nie widzę...
No mam sobie czata w tej grze. Kod po stronie klienta jest mniej więcej taki:
let p = document.createTextNode('p')
p.appendChild(document.createTextNode(message))
document.getElementById('chatbox').appendChild(p)
Gdzie message
to wiadomość, którą jeden z userów wysyła na czata, i którą serwer rozgłasza wszystkim klientom.
No to się zacząłem bawić. Mianowicie (bez implementowania po stronie serwera żadnej walidacji) wysłałem sobie na czata wiadomość treści następującej:
<script>window.alert("injection")</script>
I... nic. Wyświetla się na czacie normalnie. Żadnego wyskakującego okienka.
No to teraz implementuję po stronie serwera zamianę <
na <
Wysyłam tą samą wiadomość. Oto, co wyświetla się na czacie:
<script>window.alert("injection")</script>
Wnoszę zatem, że document.createTextNode(whatever)
po stronie klienta jest odporny na wszelkie dziwne pomysły i jego użycie już starczy za wszelkie walidacje, sanityzacje, i inne takie? Tak, że na własną rękę żadne walidacje już nawet nie powinny być robione? Czy jednak trzeba jeszcze czegoś dopatrzeć?
Jakaś zasada, kiedy należy próbować sanityzować niezaufane stringi (jak mnie uczono), a kiedy nie należy?