AJAX
Ik heb me de laatste tijd verder verdiept in AJAX om optimaal te benutten binnen de ontwikkeling van applicaties.
Nu was mijn vraag wat jullie mening is bij het gebruik van AJAX, en hoe jullie dit in de praktijk toepassen. Hierbij maak ik me met name zorgen over beveiliging vs. flexibiliteit.
Enkele zaken waarvoor ik AJAX wil gaan inzetten:
Valideren van een formulierveld
- Zo wil ik bij een bezoeker die zich wil registreren in de DB kunnen kijken of de gebruikersnaam/emailadres al in gebruik is.
Invullen/aanvullen van formuliervelden
- Adres opzoeken bij postcode, zoekbox aanvullen, etc.
Laden van HTML
- Opvragen van een complete HTML pagina, voor een inline-popups (zoals iBox).
- Opvragen van een blok HTML code om de inhoud van bepaalde elementen te veranderen (banner/nieuwsitem op homepage, chat venster waarmee klant met websitebeheerder kan chatten, etc).
Database handelingen
- Opvragen, updaten en toevoegen van records in de database. Bijvoorbeeld de volgorde van items automatisch opslaan nadat deze d.m.v. drag/drop zijn verschoven.
*bump*
De beveiligingen laat ik over aan het PHP bestand dat wordt aangeroepen door AJAX. Als je vooraf gaat controleren, heeft dat geen zin; de gebruiker kan namelijk zo terugzoeken welke gegevens mee verzonden worden naar welk bestand. Het liefst maak ik ook gebruik van de method "POST", omdat dat nog wat extra moeite vergt van een gebruiker om daadwerkelijk het bestand juist aan te kunnen roepen. Als het PHP bestand er dan ook nog voor zorgt dat de mee gestuurde variabelen op juistheid gecontroleerd worden is het volgens mij best veilig.
Ik neem aan dat ik bij een AJAX request de PHPSESSID gewoon kan meegeven?! Dus ik zou al kunnen forceren dat een gebruiker ingelogd moet zijn om bepaalde pagina's te kunnen aanroepen.
Maar hoe zorg ik er nu voor dat de achterliggende PHP pagina flexibel is, en de AJAX-aanroep toch beveiligd
Zo maar ff wat 'brainstormen':
Ik stel me zo voor dat ik vanuit mijn pagina een UPDATE query zou willen kunnen uitvoeren. Deze stuurt dan bijv. een QUERY-string als parameter mee naar de PHP-pagina.
Nu wil ik voorkomen dat 'hackers' ineens tal van wijzigingen gaan aanbrengen in deze query.. dus moet deze verder beveiligd worden.. wat is daarvoor een goede aanpak.
Wat ook zou kunnen is een database tabel maken die tal van queries bevat.
AJAX roept dan het PHP script op met een query-ID die aangeeft welke query moet worden uitgevoerd. Probleem daar is echter hoe parameters in de query's kunnen worden toegevoegd...
je kan het zo doen
Code (php)
of zo:
var hash = hex_md5(userid + status + 'MaHashSalt!');
en dan als je de pagina aanvraagt krijg je de volgende hash
index.php?user=17603&status=doing+well&hash=96706c5aa49bda800e9b8b0858485ac6
met de volgende php code:
Code (php)
etc.etc.
er zijn heel veel mogelijkheden om het veilig te maken
maar wat jij zegt
"Nu wil ik voorkomen dat 'hackers' ineens tal van wijzigingen gaan aanbrengen in deze query.. dus moet deze verder beveiligd worden.. wat is daarvoor een goede aanpak."
kun je makkelijk tegen gaan door dat je in beschikking bent om sessions te gebruiken, hashes enz.
is wel te doen..
Mijns inziens is de 'HTTP_X_USERAGENT' beslist niet te vertrouwen.. in o.a. Opera kun je deze variabele in je browser zelf instellen. Zeker omdat je die setting zelf in je javascript SET, kan de 'hacker' deze waarde eenvoudig kopiëren, en overnemen in zijn browser.
Daarnaast moet de hash worden berekend via javascript, vlak voordat de gewenste URL door AJAX wordt opgeroepen. Dit betekend dat de 'secret hash key' in je javascript moet staan.. oftewel gewoon uit te lezen is via het bekijken van de broncode..
ik denk meer dat je meer tijd moet besteden om met php te controlleren dan met ajax de gegevens veilig te sturen.
trouwens misschien wel handig:
http://www.ebrueggeman.com/blog/tag/forged-ajax-request/
maar ik zie het als een formulier. Als je een formulier verzend heb je ook namelijk een name tag en een value.
dit controlleer je natuurlijk door je php pagina. wanneer het goed is voeg je het toe in je database.
met ajax is het ook zo.
je krijgt door middel van get request een value die je moet controlleren en een actie moet voeren..
nja suc6 ermee ;)
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
Wat wil je precies beveiligen? Cookies worden gewoon meegestuurd bij AJAX requests, dus je kan gewoon gebruik maken van $_SESSION, en de beveiliging is inweze vrijwel gelijk aan die van normale pagina's volgens mij.
controlleer de url wellicht in ajax om cross source request forgery CSRF tegen te gaan. Verder zou ik zeggen doe zoveel mogenlijk in de backend. wat niet weet wat niet deert...
Nadeel is echter dat je per formulier een 'uniek' afhandel-script moet ontwikkelen die input en rechten valideert. Ik hoopte een oplossing te vinden waarmee ik de afhandeling veel flexibeler kan oplossen, maar miss. is dat er gewoon weg niet :(
Ik weet niet of je moet zeggen dat het slecht is om voor elk formulier een aparte afhandeling hebt. Dat strookt volgens mij toch wel met het MVC pattern, en vergroot dus de uitbreidbaarheid.
Voor een formulier moet je vaak unieke code schrijven om een goede afhandeling en beveiliging te garanderen. Ik hoop echter via enkele standaard oplossingen tal van AJAX-requests te kunnen afhandelen.