Potrzebowałem przekazać zmienną sesyjną do zmiennej w JS. Użyłem takiego kodu:
Czyli json_encode()
dodaje za mnie cudzysłowy
Tak, co jednak nie znaczy, że dla samych cudzysłowów należy go używać :)
Yyy, a skąd.
json_encode()
tylko dodaje cudzysłowy, jeśli:
- Twoja zmienna to jest
string
- Twoja zmienna nie ma w sobie cudzysłowów
- Twoja zmienna nie ma w sobie żadnego backslasha
- Twoja zmienna nie zawiera żadnego znaku Unicode
- Twoja zmienna nie zawiera nowych liń, tabulatorów, i innych dziwnych rzeczy.
Jeśli Twój $_SESSION['login']
spełnia te kryteria, to nigdy byś nie zobaczył jak łączneie stringów może źle pójść ;) A pójść może bardzo źle.
To co na prawdę robi json_encode()
to zwraca reprezentację JSON parametru, czyli innymi słowy jego JavaScript-Object Notation - zapis literału obiektu z JavaScript. Wrenderując dane w kod JavaScript, json_encode()
jest tak konieczne, jak htmlEntities()
dodając dane do HTML, lub mysql_real_escape_string()
dodajć coś do SQL'a.
Jeśli chcesz zobaczyć czemu Twój zapis bez json_encode()
się tragicznie rozjedzie, sugeruję dodać jakikolwiek "dziwny" znak, np cudzysłów, apostrof albo backslash ;)
To czemu json_encode()
jest istotny, to:
- Możesz wrenderować int, np
json_encode(4)
, zwraca 4
.
- Możesz wrenderować tablicę, np
json_encode(['1', '2'])
- Możesz wrenderować obiekt, np
json_encode(['key' => 'value'])
- Również boolean,
json_encode(true)
.
- Wrenderują string, upewnisz się, że nie tworzysz jakiegoś frankensteina
Teraz wyobraź sobie, co by było, gdybyś nie korzystał z json_encode()
, a jakiś użytkownikowi udałoby się ustawić login na string
"; alert("You have been hacked");
Książkowy XSS, który dodatkowo jest bardzo niebezpieczny.