[PHP] optimale beveiliging beheerfunctie

Pagina: 1
Acties:
  • 305 views sinds 30-01-2008
  • Reageer

Onderwerpen


Verwijderd

Topicstarter
Ik ben bezig een beheerfunctie te maken voor een site die grote aantallen gebruikers zal krijgen. Beheerders zullen in staat zijn om alle mogelijke gegevens die op de site gebruikt worden te wijzigen, inclusief tegoeden (geld dus) die gebruiker hebben. Het behoeft geen uitleg dat deze beheerfunctie optimaal beveiligd moet zijn en dat er geen enkele mogelijkheid moet zijn waarop personen die geen beheerder zijn toch toegang krijgen tot de beheeropties.

Zelf had ik gedacht om in de gebruikerstabel in Mysql simpelweg een apart soort gebruiker aan te maken die een code krijgen in een veld gebruikerstype die afwijkt van normale gebruikers. Vervolgens zouden beheerders dan op dezelfde manier inloggen als "normale gebruikers". Bij het inloggen wordt dan bekeken van welk type de gebruiker is en wordt dit type in een sessievariabele gezet.
Hierna wordt bij het openen van de verschillende pagina's van de website steeds naar deze sessievariabele gekeken om te bepalen of alleen de reguliere functies getoond moeten worden of dat ook de beheerfuncties getoond moeten worden.

Nu vraag ik me af of bovenstaande oplossing een goede is? Komt dit in de buurt bij wat gebruikelijk is? Of zijn er wellicht andere, (betere en veiligere) manieren om een beheerfunctie te implementeren?

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je hebt het nu over verschillende dingen. Je kan kijken naar de manier waarop een gebruiker moet inloggen. Dit kan je met (bij wijze van spreke) met .htaccess afhandelen, of een formulier waar je bijvoorbeeld weer met sessies en/of cookies werkt. Een salt toevoegen en met javascript al het password encoden voordat je het over het internet stuurt is ook mogelijk.

Daarnaast wil je kijken naar de manier waarop een gebruiker ingelogd blijft. Dit kan je elke keer met de database controleren, werken met een sessie-id. De nodige informatie opslaan in een sessie en/of bepaalde informatie opslaan (ip-logging e.d.).

Je wil kennelijk ook iets van een database model voor je access control opstellen. Daar zijn heel veel verschillende manieren voor te verzinnen. Je kan het meest simpele kiezen om een bitje te zetten als iemand beheerder is of niet. Je kan bitwise een tekenreeks controleren of voor de meest uitgebreide optie gaan: Role Based Access Control.

Het ligt helemaal aan jouw programmeerkunde en type applicatie welke keuzes je maakt :)

  • elmer25
  • Registratie: Februari 2002
  • Laatst online: 01-12-2021

elmer25

ooit was ik 25

De authenticatie (wie is wie) kun je na het inloggen inderdaad in een sessie var zetten.

De autorisatie (wie mag wat) zou ik bij elk request uit de database lezen. Dit kost uiteraard meer performance, maar heeft als voordeel dat een ingetrokken permissie niet pas na het verlopen van een sessie echt niet meer werkt.

En de verbinding natuurlijk via SSL laten lopen.

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

sla in de sessie ook het ip op en controlleer bij elke pageview of dat het session_ip nog hetzelfde is als het remote_addr om zo sessionhijacking te voorkomen.

Aunt bunny is coming to get me!


Verwijderd

Topicstarter
bedankt voor de reacties!

ik had ook zitten denken aan het beperken van de inlogmogelijkheden door alleen bepaalde ip's toe te laten via htaccess voor de beheerfunctie, maar dit gaat niet omdat beheerders vanaf overal in moeten kunnen loggen

afgaande op jullie reactie lijkt me een combinatie van het controleren van het gebruikerstype dat bij het inloggen in de sessie wordt gezet en het controleren van session_ip=remote_addr behoorlijk krachtig.

Als ik deze twee zaken combineer is het dan nog steeds nodig om SSL te gebruiken? Wat voegt gebruik van SSL concreet toe?

Ten slotte vraag ik me af wat het risico is dat een hacker het wachtwoord en de gebruikersnaam van een beheerder weet te achterhalen met een of ander hacktool. Als beiden erg ingewikkeld zijn (zeg maar beiden 10 tekens met zowel letters als cijfers en andere tekens) is er dan toch nog een kans dat men dit achterhaalt??

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
Het gebruik van SSL voegt toe dat de data versleuteld wordt verstuurd en dus niet zo makkelijk te achterhalen is. Als het om geld gaat : DOEN.

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Nu 't zal waarschijnlijk misschien niet zo nuttig zijn. Maar stel dat je geen session vars gaat gebruiken, want dat is dus eigenlijk info opslaan. Maar dus eigenlijk constant de gebruiker z'n toegang checkt via de database. Het voordeel is dan dat wanneer je rechten van een user wijzigt dit ook direct wordt doorgevoerd.

Als je met session vars gaat gebruiken blijven de rechten bestaan totdat de sessie opnieuw is aangemaakt en de user opnieuw aanmeld. Natuurlijk kan je bij toewijzing van nieuwe rechten de session natuurlijk altijd verwijderen en de user verplichten opnieuw in te loggen.

Nadeel van constant te checken in de DB is dat bij een drukke site er dus een massa verkeer loopt tussen DB & site wat misschien dan vertraging kan opleveren.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


  • mithras
  • Registratie: Maart 2003
  • Niet online
imp4ct schreef op donderdag 16 augustus 2007 @ 15:55:
Nu 't zal waarschijnlijk misschien niet zo nuttig zijn. Maar stel dat je geen session vars gaat gebruiken, want dat is dus eigenlijk info opslaan. Maar dus eigenlijk constant de gebruiker z'n toegang checkt via de database. Het voordeel is dan dat wanneer je rechten van een user wijzigt dit ook direct wordt doorgevoerd.

Als je met session vars gaat gebruiken blijven de rechten bestaan totdat de sessie opnieuw is aangemaakt en de user opnieuw aanmeld. Natuurlijk kan je bij toewijzing van nieuwe rechten de session natuurlijk altijd verwijderen en de user verplichten opnieuw in te loggen.
Nee, je hebt gewoon een sessie-tabel in je database staan. Daarin staat bijvoorbeeld sessie + laatste keer inloggen + user id & mogelijk ip adres. Dit controleer je tegen de sessie die de gebruiker als sessie id heeft.

Dan ga je vervolgens de user authoriseren met wat hij/zij allemaal mag, wat je met een apart rechtensysteem ook weer opslaat in je database.
Nadeel van constant te checken in de DB is dat bij een drukke site er dus een massa verkeer loopt tussen DB & site wat misschien dan vertraging kan opleveren.
Zelfs React doet dat zo waar GoT op draait (vast wel met enkele performance boosts) maar dat draait dus wel gewoon best ok :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ah ok, ik begrijp er al weer wat meer van. In mijn geval zijn er echter maar een paar beheerders en dit zullen er niet snel meer dan 5 worden. Verder zijn er alleen gewone gebruikers en beheerders dus er zijn slechts twee groepen. Binnen die groepen heeft iedereen precies dezelfde rechten. Waar het mij nu vooral nog om gaat is of het veilig is om beheerders en gewone gebruikers van dezelfde pagina's (dus dezelfde php files) gebruik te laten maken. In ieder file wordt dan inderdaad de status van de gebruiker gecheckt en vervolgens worden alleen als de status beheerder is ook de beheerfunctie weergegeven en anders alleen de gewone functies.

Is dit veilig genoeg of zou ik er beter aan doen de beheerders een hele set eigen php files te geven die in een aparte directory staan en waar de normale gebruikers sowieso helemaal niet bij kunnen komen (bij de hele dir dus niet)?

Acties:
  • 0 Henk 'm!

  • japaveh
  • Registratie: Maart 2003
  • Laatst online: 20-09 20:47

japaveh

Jield BV

Verwijderd schreef op vrijdag 17 augustus 2007 @ 08:59:
ah ok, ik begrijp er al weer wat meer van. In mijn geval zijn er echter maar een paar beheerders en dit zullen er niet snel meer dan 5 worden. Verder zijn er alleen gewone gebruikers en beheerders dus er zijn slechts twee groepen. Binnen die groepen heeft iedereen precies dezelfde rechten. Waar het mij nu vooral nog om gaat is of het veilig is om beheerders en gewone gebruikers van dezelfde pagina's (dus dezelfde php files) gebruik te laten maken. In ieder file wordt dan inderdaad de status van de gebruiker gecheckt en vervolgens worden alleen als de status beheerder is ook de beheerfunctie weergegeven en anders alleen de gewone functies.
Ik zou dan gewoon in de userstabel een flag zetten die aangeeft of de gebruiker beheerder is of niet, je kunt die status dan opvragen bij het aanroepen van de pagina en aan de hand daarvan inderdaad bepaalde functies laten zien

Het kan handig zijn om speciale adminpaginas te maken zeker als daar alleen functies op staan die voor admins geschikt zijn. Maar je kunt ook prima aan de hand van de status op de normale userpagina's functies zetten die alleen voor admins zijn, dat kan uitstekend in dezelfde files en dat is ook veilig genoeg. Ook op GoT wordt dat zo gedaan, immers mods zien meer knopjes dan wij maar dat staat allemaal wel in dezelfde file (lees: template). Qua onderhoud is dat ook een stuk makkelijker.

Let wel op dat je niet alleen links verbergt voor de gebruikers, maar dat je bij de afhandeling van de link ook nog eens op rechten checked. Dit om te voorkomen dat een 'slimme' gebruiker iets als www.domein.nl/forum/delete_bericht/1 intypt.

Solo Database: Online electronic logbook and database system for research applications


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
japaveh schreef op vrijdag 17 augustus 2007 @ 09:40:
[...]
Let wel op dat je niet alleen links verbergt voor de gebruikers
Hoe doe je dit ?

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

  • japaveh
  • Registratie: Maart 2003
  • Laatst online: 20-09 20:47

japaveh

Jield BV

pseudocode
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
if ($user->status == 'admin') {
   print '<a href="http://domein.nl/forum/edit_message/10">Pas dit bericht aan</a>' ;
}

//en dan..
if ($action == 'edit_message') {
   if ($user->status != 'admin') {
      die ('Scheer hier weg');
   }
   
   // etc
}

[ Voor 19% gewijzigd door japaveh op 17-08-2007 10:17 . Reden: parse error... ]

Solo Database: Online electronic logbook and database system for research applications


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
aha ok, dat is precies hoe ik het in gedachten had en bij een aantal pagina's ook al gemaakt hebt. Ik zocht alleen even de bevestiging dat dit dus inderdaad veilig genoeg is, hartelijk dank daarvoor!

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je kunt niet zomaar alleen je admin pagina's beveiligen en dan een goed gevoel hebben over je veiligheid. Je zult je hele applicatie veilig moeten bouwen. Google in ieder geval eens op SQL Injection (eventueel i.c.m. PHP) en kijk of je applicatie daar gevoelig voor is. Dat samen met de tips die hier in dit topic genoemd zijn, ben je een goed eind op weg.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
En wellicht offtopic, maar wel iets om rekening mee te houden: bewaar plain-text-wachtwoord files (bijvoorbeeld een config om met je database te connecten) altijd buiten je webroot. Mocht ooit php niet meer werken (en worden je php files gewoon als tekst gepresenteerd) staan niet al je wachtwoorden open en bloot ;)

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Nu online

DexterDee

I doubt, therefore I might be

iH8 schreef op donderdag 16 augustus 2007 @ 12:42:
sla in de sessie ook het ip op en controlleer bij elke pageview of dat het session_ip nog hetzelfde is als het remote_addr om zo sessionhijacking te voorkomen.
Veiliger is het om nog meer CGI variabelen te gebruiken behalve het IP adres. Zo is de browserversie en operating system en ingestelde taal ook statisch. Ook is het handig om naar de X-FORWARDED-FOR header te kijken en deze mee te nemen als deze bestaat.
Het makkelijkst is het om van een aantal van die variabelen een MD5 digest te maken en deze digest elke keer te vergelijken. Zo voorkom je dat door proxy gebruik session hijacking nog steeds mogelijk is.
Zorg er ook voor dat voordat er belangrijke admin acties uitgevoerd worden, dat het session id geregenereerd wordt (zie functie session_regenerate_id)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

DexterDee schreef op vrijdag 17 augustus 2007 @ 16:54:
[...]

Veiliger is het om nog meer CGI variabelen te gebruiken behalve het IP adres. Zo is de browserversie en operating system en ingestelde taal ook statisch. Ook is het handig om naar de X-FORWARDED-FOR header te kijken en deze mee te nemen als deze bestaat.
Het makkelijkst is het om van een aantal van die variabelen een MD5 digest te maken en deze digest elke keer te vergelijken. Zo voorkom je dat door proxy gebruik session hijacking nog steeds mogelijk is.
Zorg er ook voor dat voordat er belangrijke admin acties uitgevoerd worden, dat het session id geregenereerd wordt (zie functie session_regenerate_id)
ik weet 't en SHA256 is nóg veiliger maar goed, ik wilde hem maar een eindje de goede kant uitduwen. trouwens wat headers betreft kan alles vervalst worden.

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wederom bedankt voor de goede adviezen, ik denk dat ik het nou wel aardig veilig kan maken:-P

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
mm toch nog een vraag. Het gaat over "session_regenerate_id();"

ik heb wat nagezocht en ik begrijp dat deze functie session hijacking kan voorkomen. Moet ik deze functie echter simpelweg op elke pagina met een admin gedeelte uitvoeren als er als admin ingelogd is? Dan zou deze functie dus bij elke pageview (als er ingelogd is als beheerder) zo'n beetje uitgevoerd worden. Is dit de bedoeling?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Nu online
In principe wel, wat het doet is zorgen dat een oud sessie-id niet meer werkt. Als iemand nu achter het sessie-ID van een admin komt is dat bij de volgende pagina-refresh alweer ongeldig, mits je'm maar elke pagina aanroept.

Een tip: waar je tot nu toe nog geen enkele aandacht aan besteed hebt zo te zien is cross-site-scripting. Als iemand een javascriptje maakt met iets als window.open('http://jouwsite.nl/admin/delete/45'); en een ingelogde admin komt op die site zal hij als je geen conformatie hebt zonder het zelf uberhaupt te merken iets verwijderen. In combinatie met bijvoorbeeld een lek in jpg afhandeling van laatst (waarbij het mogelijk werd javascript uit te voeren door een corrupte header mee te geven met een plaatje) kun je voor elkaar krijgen dat je als gebruiker een plaatje kan uploaden of linken wat ervoor zorgt dat hij feitelijk jou admins kan laten doen wat'ie wil.

Op zich is dit een van de moeilijkste dingen om je tegen te beveiligen, zelf controleer ik doorgaans met $_SERVER['HTTP_REFERER'] of admin-acties wel vanuit een adminpagina aangeroepen worden, maar helemaal veilig is dit ook niet. Zorg er in ieder geval voor dat gevaarlijke acties niet uitgevoerd kunnen worden door enkel een locatie te openen, dan kom je al een heel eind :)

[ Voor 6% gewijzigd door FragFrog op 19-08-2007 16:31 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

FragFrog schreef op zondag 19 augustus 2007 @ 16:31:
Op zich is dit een van de moeilijkste dingen om je tegen te beveiligen, zelf controleer ik doorgaans met $_SERVER['HTTP_REFERER'] of admin-acties wel vanuit een adminpagina aangeroepen worden, maar helemaal veilig is dit ook niet. Zorg er in ieder geval voor dat gevaarlijke acties niet uitgevoerd kunnen worden door enkel een locatie te openen, dan kom je al een heel eind :)
Totdat iemand met een firewall werkt die de referrer leeg haalt :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Muthas
  • Registratie: December 2005
  • Niet online

Muthas

O+

FragFrog schreef op zondag 19 augustus 2007 @ 16:31:
In principe wel, wat het doet is zorgen dat een oud sessie-id niet meer werkt. Als iemand nu achter het sessie-ID van een admin komt is dat bij de volgende pagina-refresh alweer ongeldig, mits je'm maar elke pagina aanroept.

Een tip: waar je tot nu toe nog geen enkele aandacht aan besteed hebt zo te zien is cross-site-scripting. Als iemand een javascriptje maakt met iets als window.open('http://jouwsite.nl/admin/delete/45'); en een ingelogde admin komt op die site zal hij als je geen conformatie hebt zonder het zelf uberhaupt te merken iets verwijderen. In combinatie met bijvoorbeeld een lek in jpg afhandeling van laatst (waarbij het mogelijk werd javascript uit te voeren door een corrupte header mee te geven met een plaatje) kun je voor elkaar krijgen dat je als gebruiker een plaatje kan uploaden of linken wat ervoor zorgt dat hij feitelijk jou admins kan laten doen wat'ie wil.

Op zich is dit een van de moeilijkste dingen om je tegen te beveiligen, zelf controleer ik doorgaans met $_SERVER['HTTP_REFERER'] of admin-acties wel vanuit een adminpagina aangeroepen worden, maar helemaal veilig is dit ook niet. Zorg er in ieder geval voor dat gevaarlijke acties niet uitgevoerd kunnen worden door enkel een locatie te openen, dan kom je al een heel eind :)
HTTP_REFERER zou ik niet gebruiken, veel firewalls maar ook browsers maken die blank, waardoor je als admin niks zou kunnen doen.

Met hem dus :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Nu online
Heb het tot nu toe gebruikt op een paar sites zonder problemen, dus of het zo erg is betwijfel ik eigenlijk ;) Maargoed, zoals ik al zei, helemaal veilig ( / handig?) is het ook niet. Als jullie betere sugegsties hebben hoor ik het ook graag, beveiliging is een van de lastigste dingen om goed te doen, hoe slim je het ook kan beveiligen er zijn altijd wel minstens evenslimme mensen die zullen proberen het stuk te maken :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Ik zou dus gewoon echt *absoluut* geen beheerders functies in code zetten voor clients. Da's een complete no-go als je het mij vraagt.

Dan maar verschillende codebases, en dan maar een aparte backend voor de beheerders, maar die kun je tenminste wel netjes beveiligen met .htaccess/.htpasswd en je hoeft je tenminste echt geen zorgen te maken over hoe je je code in elkaar steekt. Vertrouw *nooit* je gebruikers, want een gebruiker kan net zo goed een PHP programmeur zijn die eens een aantal trucjes gaat uitproberen om te kijken of jij je code wel goed beveiligd hebt. Of je serverbeheerder heeft per ongeluk je PHP module uitgeschakeld en je PHP files worden als plaintext uitgepoept, daar sta je dan....

Het is imo gewoon vragen om problemen als je admin code en client code door elkaar heen schrijft.

Kortom:
• Aparte code base (liefst op een compleet andere url)
• Mysql User met alleen de juiste rechten voor de clients
• Een 'elevated' MySQL user voor de beheerders
• Geen CRUD code aan je clientside (waarom zou je ook)
• Beveiligen die handel met .htaccess/.htpasswd

edit:

Verder vind ik het gewoon ranzig ook als je ineens stukjes beheersfunctie door je clientcode heen ziet :X

[ Voor 44% gewijzigd door SchizoDuckie op 20-08-2007 13:07 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Nu online
Mwoach, kwestie van smaak, zelf gebruik ik doorgaans een aparte class voor beheersfuncties die een constructor heeft die authenticatie checked. Op die manier ben je er zeker van dat alle adminfuncties alleen beschikbaar zijn voor iemand die als admin ingelogd is. Sowieso gooi ik al m'n PHP files op de index na in een folder die niet beschikbaar is dankzij een .htaccess, dan kunnen je gebruikers echt verrekte weinig doen.

Mooier is een aparte beheermodule wel natuurlijk, maar als je een gelimiteerd aantal subdomeinen hebt of geen zin hebt een complete losse backend te schrijven kan ik me wel voorstellen dat je het integreert. Helemaal omdat je er soms simpelweg niet aan ontkomt: neem een forum waarin moderators posts kunnen bewerken, vBulletin bijvoorbeeld heeft een hippe ajax module waarmee dat direct kan, als je dat zou omschrijven naar een aparte backend verlies je een enorm stuk useability, terwijl het voor zover ik weet nog steeds niet te misbruiken is.

[ Voor 6% gewijzigd door FragFrog op 20-08-2007 18:23 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • MuisM4t
  • Registratie: Mei 2007
  • Niet online
DexterDee schreef op vrijdag 17 augustus 2007 @ 16:54:
[...]

Veiliger is het om nog meer CGI variabelen te gebruiken behalve het IP adres. Zo is de browserversie en operating system en ingestelde taal ook statisch. Ook is het handig om naar de X-FORWARDED-FOR header te kijken en deze mee te nemen als deze bestaat.
Het makkelijkst is het om van een aantal van die variabelen een MD5 digest te maken en deze digest elke keer te vergelijken. Zo voorkom je dat door proxy gebruik session hijacking nog steeds mogelijk is.
Zorg er ook voor dat voordat er belangrijke admin acties uitgevoerd worden, dat het session id geregenereerd wordt (zie functie session_regenerate_id)
Ik switch weleens tussen browsers... :9

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
FragFrog schreef op zondag 19 augustus 2007 @ 16:31:

Op zich is dit een van de moeilijkste dingen om je tegen te beveiligen, zelf controleer ik doorgaans met $_SERVER['HTTP_REFERER'] of admin-acties wel vanuit een adminpagina aangeroepen worden, maar helemaal veilig is dit ook niet. Zorg er in ieder geval voor dat gevaarlijke acties niet uitgevoerd kunnen worden door enkel een locatie te openen, dan kom je al een heel eind :)
Volgens de HTTP spec mag een GET actie ook geen side-effects hebben. Kon die JPEG exploit ook posten?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 22:41
Whizzkid92 schreef op dinsdag 21 augustus 2007 @ 10:22:
[...]

Ik switch weleens tussen browsers... :9
Dan heb je dus een nieuwe sessie, en moet je dus opnieuw inloggen. Per sessie blijft de gebruikte browser gelijk.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Grijze Vos schreef op dinsdag 21 augustus 2007 @ 12:12:
Volgens de HTTP spec mag een GET actie ook geen side-effects hebben.
Een actie als 'bekijk gegevens van user X' is idempotent en hoort gewoon via GET gedaan te worden. :)

Het punt is dat het geheimhouden van admin-urls niet je enige vorm van beveiliging moet zijn, geheime urls is slechts een stukje 'security through obscurity'.

[ Voor 54% gewijzigd door Voutloos op 21-08-2007 12:39 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Voutloos schreef op dinsdag 21 augustus 2007 @ 12:36:
[...]

Een actie als 'bekijk gegevens van user X' is idempotent en hoort gewoon via GET gedaan te worden. :)

Het punt is dat het geheimhouden van admin-urls niet je enige vorm van beveiliging moet zijn, geheime urls is slechts een stukje 'security through obscurity'.
Oh, daar ben ik het absoluut mee eens. Ik zie dat ik net eigenlijk te weinig had gequote van Frag's post. Ik doelde met name met mijn vraag op dat stukje XSS beveiliging. Grotendeels ga je dat soort dingen tegen door javascript e.d. door je gebruikers niet toe te staan, maar als een jpeg zo'n exploit heeft, kun je daar weinig tegen doen. (Welke forumadmin laat zijn gebruikers geen plaatjes in hun posts zetten.) Ik vroeg me af of die exploit ook kon posten, of alleen kon getten, want dat is een verschil. Dat een forummoderator stiekem door een XSS exploit naar een pagina gaat waar hij userdetails bekijkt is niet zo erg, maar als die forummoderator een post maakt naar de server waarin hij EvilHacker's userlevel verhoogt naar admin status, is nogal een verschil.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Nu online
Grijze Vos schreef op dinsdag 21 augustus 2007 @ 12:12:
Volgens de HTTP spec mag een GET actie ook geen side-effects hebben. Kon die JPEG exploit ook posten?
Correct, maar ik herinner me nog de ophef over Googles webaccelerator die ook alleen maar GET requests versnelde ;) Niet iedereen houdt zich aan de specs helaas ;) In principe kun je alle javascript ermee uitvoeren die je maar wilt, dus ook het versturen van POST documenten, zie ook dit t.net artikel.

Stel dat ik een plaatje upload (bijvoorbeeld als avater op een forum) en die geef ik als source een ingevuld form mee en een onload submit scriptje hoeft er maar 1 admin op een pagina te komen met die source om enorm veel schade te kunnen doen. Nu is deze exploit nog af te vangen (door bij imageuploads te kijken naar het mimetype en geen externe afbeeldingen toe te staan) maar er gaan gegarandeert bugs komen die je niet op tijd aan ziet komen. Voor zover ik weet zijn er drie manieren om je hier tegen te beschermen:

1. Je controleert vanaf welke pagina een form verzonden wordt met HTTP_REFERER
2. Je zet je beheermodule op een ander (sub) domein die je goed beveiligt - en dan nog ben je de sjaak als iemand toevallig op de beheermodule is ingelogd en tegelijk de main site bekijkt.
3. Je geeft een uniek ID mee met elke transactie (deze beveiliging gebruik ik bijvoorbeeld in een bepaald CMS voor delete-acties) die je bij het uitvoeren van de transactie weer controleert.

1 is voor mij een quick fix, zoals gezegd niet ideaal maar meestal werkt het prima :+ Methode 3 is voor zover ik weet haast niet te kraken als je'm goed toepast maar een stuk lastiger te implementeren aangezien je unieke controleerbare codes moet genereren. Een optie is om elke refresh een uniek ID mee te geven in een sessie en bij het uitvoeren controleren of het ID in de sessie gelijk is aan het ID in je form, een externe site zal nooit een sessie op jou domein kunnen zetten en een geinfecteerd plaatje op de site zelf kan welliswaar wel een submit uitvoeren maar weet niet de (geheime) code in je sessie. Je bent dan alleen nog de klos als je externe javascript op dezelfde pagina hebt als adminfuncties (zoals je bijvoorbeeld bij een forum kan hebben waar admin en gebruikersfuncties op dezelfde pagina staan) maar daar kun je overheen komen door eerst een tussenpagina te laden voor bepaalde acties toegestaan zijn. vBulletin doet dit bijvoorbeeld, als je een post wilt deleten word je altijd eerst geredirect naar een delete formulier :)

Overigens is geen enkel systeem echt helemaal waterdicht - kijk bijvoorbeeld naar die banksite die laatst gespoofed is, als iemand je clients' hostfile aanpast en een slimme proxy maakt ga je er alsnog aan als je niet ook een SSL verbinding vereist om maar iets te noemen. Hou daarom ook altijd een transactielog bij en stop desnoods verdachte transacties in een moderatieque - als het om geld gaat zijn hackers helaas verdraaide inventief ;)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
FragFrog schreef op dinsdag 21 augustus 2007 @ 13:30:
[...]

Correct, maar ik herinner me nog de ophef over Googles webaccelerator die ook alleen maar GET requests versnelde ;) Niet iedereen houdt zich aan de specs helaas ;) In principe kun je alle javascript ermee uitvoeren die je maar wilt, dus ook het versturen van POST documenten, zie ook dit t.net artikel.
Die reactie van MS is dan wel weer typisch. 8)7 Mijn huidige versie forumsoftware houdt zich overigens ook niet aan die spec hoor, ik vind die confirmation page zo irritant dat ik hem er een versie of 8 geleden weg heb gegooid, en daarna kwam ik een keer die regelis in de spec tegen en staat het herinbouwen op mn todo list. :)
Voor zover ik weet zijn er drie manieren om je hier tegen te beschermen:
3. Je geeft een uniek ID mee met elke transactie (deze beveiliging gebruik ik bijvoorbeeld in een bepaald CMS voor delete-acties) die je bij het uitvoeren van de transactie weer controleert.

[..]

Methode 3 is voor zover ik weet haast niet te kraken als je'm goed toepast maar een stuk lastiger te implementeren aangezien je unieke controleerbare codes moet genereren.
Dat is idd wel een goede methode. Denk dat ik die ga gebruiken in mn v2.0 code.
Overigens is geen enkel systeem echt helemaal waterdicht - kijk bijvoorbeeld naar die banksite die laatst gespoofed is, als iemand je clients' hostfile aanpast en een slimme proxy maakt ga je er alsnog aan als je niet ook een SSL verbinding vereist om maar iets te noemen. Hou daarom ook altijd een transactielog bij en stop desnoods verdachte transacties in een moderatieque - als het om geld gaat zijn hackers helaas verdraaide inventief ;)
Mja, dat sowieso. Maar goed, als je client zn PC overrun is valt dat buiten de scope van jouw website, dus daar kun je weinig tegen beginnen. En bankzaken doe je natuurlijk via SSL om MitM attacks tegen te gaan.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • AW_Bos
  • Registratie: April 2002
  • Nu online

AW_Bos

Liefhebber van nostalgie... 🕰️

FragFrog schreef op maandag 20 augustus 2007 @ 18:22:
Mwoach, kwestie van smaak, zelf gebruik ik doorgaans een aparte class voor beheersfuncties die een constructor heeft die authenticatie checked. Op die manier ben je er zeker van dat alle adminfuncties alleen beschikbaar zijn voor iemand die als admin ingelogd is. Sowieso gooi ik al m'n PHP files op de index na in een folder die niet beschikbaar is dankzij een .htaccess, dan kunnen je gebruikers echt verrekte weinig doen.
kan ook buiten je webroot hoor, als je daar access toe hebt :).

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


  • FragFrog
  • Registratie: September 2001
  • Nu online
Ariën Clay schreef op donderdag 23 augustus 2007 @ 01:03:
kan ook buiten je webroot hoor, als je daar access toe hebt :).
Natuurlijk kan het vaak wel maar het is lang niet altijd wenselijk. Als je meerdere sites onder 1 domein hebt wil je het liefst een nieuw softwarepakket in z'n eigen dir kunnen kopieeren en er mee klaar zijn. Alle PHP files dan in een aparte folder buiten je webroot gooien is onhandig (omdat je dan ook weer je includes moet gaan aanpassen) en bovendien onnodig aangezien een .htaccess niet spontaan stopt met werken - en zelfs al zou'ie dat wel doen heb je nergens last van als je PHP nog wel geparsed wordt. Dat je PHP parser faalt oke, kan nog voorkomen, maar een webserver die spontaan besluit geen .htaccess rules meer te volgen? Kom nou, dan zijn er doorgaans wel veel grotere securityrisico's waar je je zorgen om kan maken :)

Als ik daarnaast af en toe dingen hoor over echt grote sites als een t.net die passwords uit laat poepen naar gebruikers omdat PHP niet meer parsed of een Facebook met eenzelfde probleem vind ik het beschermen middels htaccess bestanden van je PHP includes dir wel al meer dan afdoende ;)

[ Site ] [ twitch ] [ jijbuis ]


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Mwoah, wat als inderdaad php niet geparsed wordt, en je webserver htaccess niet meer toe laat. Granted, dat zijn 2 fuckups in 1, maar het kan opgelost worden. ;)

Ikzelf heb tegenwoordig gewoon deze setup:

<hoofdmap> <- config file hier
<hoofdmap>/web <- entrypoint voor web met index.php
<hoofdmap>/modules
etc..

Weet niet of alle hosters dat zo supporten, dus misschien verander ik het nog wel in mijn nieuwere versie.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1