ugrás a tartalomhoz

Ajax biztonság?

mahoo · 2010. Júl. 23. (P), 17.08
Sziasztok!

Először fordul elő, hogy úgy kell elkészíteni egy honlapot, hogy a javascript támogatás kötelező, ha nincs, akkor nincs honlap használat.
Emiatt úgy döntöttem, hogy a különböző formok küldését, mentését - php-val -, ill. a visszaigazoló üzeneteket Ajax segítségével oldanám meg.
Vagyis nem akarok semmit varázsolni - nem is ismerem ilyen szinten a js-t -, csak form küldés és a kapott válasz vagy eredménylista megjelenítése.
A kérdésem az, hogy milyen biztonsági megoldásokat kell megvalósítani a kódban, mire kell felkészíteni a js kódot ahhoz, hogy ellenállóbb legyen a támadásokkal szemben.
PHP oldalról ugye a szokásos adatbázismentéshez mysql_real_escape_string, megjelenéshez htmlspecialchars, stb. Ugyanezek az apróságok érdekelnének engem a js oldaláról.
Ezen felül bármilyen jótanácsot, javaslatot szívesen veszek, amire oda kell figyelni.
 
1

Szerver oldal

Poetro · 2010. Júl. 23. (P), 17.51
Mindent a szerver oldalon KELL validálni, ugyanis azt a kliens nem tudja módosítani. Kényelmi okokból lehet előre is validálni JavaScript-ben, de ez nem váltja ki a szerver oldali ellenőrzést, ami kötelező. A felhasználó ugyanis a böngészőjében módosítani tudja a JavaScript kódot, ez adódik a JavaScript természetéből is. Ebből következik, hogy igazából nem lehet varázsolni, legfeljebb törekedni arra, hogy a felhasználó azt lássa, amit mutatni szeretnénk neki, és közben kellemes élmény legyen számára használni a szolgáltatásunkat.
2

Szia! Ugyanúgy kell kezelni

inf · 2010. Júl. 23. (P), 20.56
Szia!

Ugyanúgy kell kezelni őket, mint a sima űrlapból érkező adatokat, szóval mindent validálni kell, ami bejön. Ezt nem is ragozom tovább.
Session cookie-nál állítsd be a http-only flag-et, hogy ne lehessen XSS-nél javascripttel lekérni a session_id-t. Permanens auth cookie-nál szintén http-only flag kell, hogy XSS-el ne tudják leszedni.
Szerver TRACE kikapcsolása alap, bár az már a szolgáltatódtól függ.
Érdemes XSS ellen is védekezni, szal nem szabad, hogy javascriptet küldjenek tartalomnak vagy linknek.
CSRF ellen legalább annyit tegyél, hogy minden felhasználónak generálsz egy egyedi azonosítót (ezt elég regisztrációkor megtenned), és azt minden POST-ban visszautaztatod header-ben. Egyébként is a bejövő POST-oknál ellenőrizni kell, hogy mi a referer, ezt a böngészők egy jó része támogatja, a másik felénél meg figyelmen kívül lehet hagyni.
Tehetsz bele az oldalba setTimeout-ot, ami a session lejárta előtt automatikusan meghosszabbítja azt. Így nem kell azzal foglalkozni, hogy mi van, ha valaki éppen hosszasan commentet ír, és közben lejár a session-je. Meg így ha POST jön be, és nincs még session az illetőnél, akkor 100%, hogy külső oldalról jött a POST, és CSRFről vagy hasonlóról van szó.
Érdemes talán az user-agent headert is nézni, hogy megváltozik e menet közben, talán nem gyakori, hogy böngészőt vált az ember egy oldal nézése közben. :-P
(window.XMLHttpRequest meg window.ActiveXObject meg hasonló dolgokat át lehet tenni saját closure-ba és törölni az eredeti helyükről. Ezt mondjuk még nem próbáltam ki, de tervben van.)
Mysql real escape string-et használj az összes bejövő paraméterre, érdemes template-ként megadni a query-det, aztán automatizálni a paraméterek escapelését. Ez mondjuk nem mindig megoldható, de az esetek nagy részében igen.
Login-nál generáld újra a session_id-t, mert elég laza a php session kezelése, könnyű belekényszeríteni valakit sessionbe.
Érdemes captchat betenni bizonyos helyekre, nézni kell a bejelentkezésnél a hibás próbálkozások számát, mind session szinten, mind account szinten. POST küldés után érdemes várakoztatni a választ bizonyos helyeken, pl ha valahova comment-el az illető, különben egy bot telegányolhatja az oldaladat.

Kb ennyi ami most eszembe jut, de nincs kifejezetten ajaxos oldalt támadó kód. Bármilyen oldalt csinálsz, nézni kell ezeket.
3

Köszönöm a gyors és kimerítő

mahoo · 2010. Júl. 23. (P), 20.59
Köszönöm a gyors és kimerítő válaszokat, nagyon hasznosak voltak!!!
4

bindParams

Nutec · 2010. Júl. 24. (Szo), 10.29
Még annyival egészíteném ki az előttem szólók válaszát, hogy az adatbázis-műveletekhez használd a php beépített PDO kiterjesztését. Azon belül pedig a bindParam metódust a változók query-nek történő átadásakor, ezzel nagyban csökkented az SQL befecskendezéses támadások lehetőségét.

Továbbá ajánlom figyelmedbe a következő cikket, nekem annak idején sok újat mondott:
Munkamenet kezelés biztonsági kérdései

Nu7ec
5

Nagyon köszi!

mahoo · 2010. Júl. 25. (V), 09.30
Nagyon köszi!