arnizzz Skrevet 20. juli 2005 Del Skrevet 20. juli 2005 (endret) Hei. Har begynt å scripte php igjen. Og har bestemt meg for å fokusere mer på sikkerhet i scriptene mine. Noen som har tips på hvordan øke sikkerheten med relativt enkle grep? Er ikke så flink i programmering generelt, så derfor vil jeg helst unngå noe alt for avansert. Det eneste av forhåndsregler jeg tar nå er å bruke htmlentities() og addslashes() på alt som kommer fra POST eller GET data. Og selvfølgelig skru av register_globals. Hvilke andre grep bør jeg foreta meg? Når det er snakk om å passordbeskytte sider og for å hindre SQL injections. I authenication-filen har jeg følgende hovedelementer som jeg tror er viktig: header("Cache-control: private"); md5() hashe passord og bruke salt. Hvordan gjøres dette egentlig? Jeg legger til en ekstra string på passordene som brukerne skriver inn før jeg md5 hasher de. Planen min er å bruke egenkryptering(md5(strrev(sha1($salt1 . $passord . $salt2)))); // Noe lignende. Eller går dette under Security through obscurity? egenkryptering() Er så enkel som man kan få det. Bare få bokstaver til å gå 5 tegn framover i alfabetet, og varianter av det. Tenker å definere slik forskjell for hver bokstav. Kreve minimum 6-8 tegn som passordlengde. Da dette forhåpentligvis vil gjøre bruteforce vanskeligere. Planlagt: Gjøre sånn at brukere har maks 5 forsøk på å logge inn før de blir satt i karantene for 10 minutter. hvordan gå fram her? Er det for enkelt å basere seg på IP-adresse? Øvrig: Har lest at hackere kan snappe opp alt brukere skriver inn via protokollscannere. Hvordan beskytte seg mot dette uten at det krever veldig gode kodeegenskaper? https? Hvordan fungerer dette? Er dette noe som ødelegger brukervennligheten? Har også lest at det er lett for hackere å stjele en session fra brukere. Muligheter for å hindre dette? Takker for svar Endret 21. juli 2005 av arnizzz Lenke til kommentar
Loomy Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Se http://phpsec.org/ Under articles og library finner du mange fine artikler, blant annet om session hijacking og måter å forhindre dette på. Lenke til kommentar
???????? Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Generelt Sikkerhet er viktig dersom du vil lager litt mer seriøse script. Det første du må gjøre er å lese kapittelet i php manualen om sikkerhet. Der står det mange viktige og gode tips! phpsec.org er et bra prosjekt, men det er fortsatt forholdsvis nytt - men det blir bedre og bedre. Det er viktig å holde seg oppdatert, og i blader som phparch.com og phpmag.net finner du mange tips. Sikre variabler Etter dette er det mye opp til deg. Det første du må være klar over er at alle variabler fra en besøkende på siden din kan være farlig. Dette inkluderer $_GET, $_POST og $_SESSION. Alle slike variabler må sikres, spesielt før de leses inn i en database. Ikke bruk funksjoner addslashes() for å sikre variabler før de lagres i en database, men bruk f.eks. mysql_real_escape_string(). Salting Planen min er å bruke egenkryptering(md5(strrev(sha1($salt1 . $passord . $salt2)))); Dette er også en måte å løse det på, men ikke helt sikker på om det er den beste, sikreste eller mest effektive. Problemet med salting er nettopp om du bruker det slik det står der: md5($salt . $variabel . $salt). Eneste fordelen med dette er at stringen blir lengre og vil ta mye lengre tid å hacke med bruteforce. Men det er statisk, og dersom noen får tilgang til databasen din og bruteforcer den vil de lett se mønsteret, som da f.eks. vil se slik ut: Hvis $salt1 = "hehe" og $salt2 = "hoho" så vil tabellen bli noe lignende hehepassord1hoho heheagagreghoho heheafef334f43hoho hehepassord4hoho Det skal da ikke mye til å skjønne at hehe...hoho ikke skal være med. Så dersom det skal saltes må du løse dette dynamsik. Hint: bruk f.eks. dato eller id. Å bruke md5() og sha1() er noe poeng er vel heller ikke sikkert. Da er det kanskje bedre å komme på egene løsninger å håndtere en hash. Et alternativ kan være å dele det i to og bytte plass på del en og to - eller andre lignende løsninger. Da begynner det å bli avanserte hackere som virkelig vil hacke deg, og spørsmålet er om scriptet ditt er så hemmelig at det er noe poeng å gøre mer enn å salte og hashe det en gang? PHP kan kræsje Merk deg at php (Zend) kan kræsje på serveren, noe som vil føre til at selve php koden vises. Så oppbevar ALDRI passord ol. i filer brukere har tilgang til. Legg alle passord i include filer som du enten beskytter med .htaccess eller endre rettighetene på (CHMOD). Session og linje lytting For at noe skal kunne lese det noen skriver til en server må de "lytte på linjen". Dette er ikke noe vanlige små sider i stor grad behøver å beskytte seg mot - men en enkel måte å gjøre dette er å installere ssl. De fleste hoster burde ha dette, så ta en titt i kontrollpanelt på webhotellet ditt. Å ta over en session er ikke avansert i det hele tatt dersom brukerene har tilgang til PHPSESSID til en bruker. For å beskytte seg mot dette må du lagre flere variabler om brukeren, f.eks. IP og browsertype. Hash dette og lagre det i sessionen, så for hver side brukeren henter så sjekker du at brukeren har samme ip og browser. Phpmag skrev en artikkel om nettopp dette litt over et år siden - du har flaks for nettopp denne utgaven gir de ut gratis på sine nettsider: https://www.entwickler.com/ssl/phppdf/ se under Try our free sample. Mask antall logginn forsøk Lagre hvert logginn forsøk i en database, men ip og brukernavn. Har en ip forsøkt å logge seg inn 5 ganger eller mer så bare viser du teksten: "Du må vente..." og gjøre det samme med et brukernavn. I tillegg burde du legge inn et varsel til deg selv dersom det plutselig er mange logginn forsøk. Det beste er å sette opp sms varsling til din mobil dersom det er over X antall logginn forsøk å løpet av X antall minutter. Dette er noen grunnleggende tips og råd. Spør gjerne mer dersom det er noe uklart eller hvis du har flere spørsmål. Lykke til Lenke til kommentar
Prodigy_ Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Fin liten artikkel, ????????. Var en tråd om det tidligere også: http://forum.hardware.no/index.php?showtopic=422184&hl= Lenke til kommentar
???????? Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Det finnes mange tråder om dette, men de fleste er ca. et år gamle eller mer - men absolutt verdt å lese. Dette var før PHP forumet ble et "Jeg vil hå et sånt script, kan noe lage det til meg". Lenke til kommentar
Prodigy_ Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Ja, det er irriterende at PHP forumet har blitt fulle av tråder som "Jeg vil hå et sånt script, kan noe lage det til meg", osv. Begynner å ligne mer og mer på Norsk Webforum, Webforumet og de som nesten bare har slike tråder. Da er det bedre at folk lærer seg litt PHP og heller spør om hjelp her, enn å spørre om noen her kan lage et script. Skjerpings folkens... Lenke til kommentar
arnizzz Skrevet 21. juli 2005 Forfatter Del Skrevet 21. juli 2005 Gadd ikke lese innlegget ditt "????????". Kan ikke du bare lage et sikkert system for meg? Men seriøst. Takk alle for masse tips. Er godt i gang med å lese, og begynner å få overblikk over de viktigste fallgruvene. Og jeg tror ikke SSL er nødvendig for mitt bruk enda, da jeg bare holder på å teste lokalt. Men det jeg ikke helt skjønner er hvorfor det ikke er noe vits i å bruke flere hash-metoder. For å bruke bruteforce må hackeren/crackeren vite hvordan man har hashet, ikke sant? så om jeg md5er,snur om på strengen, sha1er, bytter litt på rekkefølgen av strengen osv. osv, vil ikke dette gjøre livet til crackeren veldig surt? Nei men jeg føler at jeg har noe å bygge på nå. Så får jeg invitere til "Hack me, and tell me how you did it-day" før jeg bruker applikasjoner til noe viktig. Hehe. Lenke til kommentar
???????? Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Grunnen til at det ikke er noen særlig hensikt med å bruke både md5 og f.eks. sha1 er forde sha1 returnerer en string på 40 eller 20 tegn, md5 returnerer 16 tegn - så alle ser lett hvilken av de to du benytter. Får de en string på f.eks. 40 tegn fra databasen så prøver de med bruteforce på sha1 og finner en match - som er en md5 hash. Denne ser de er på 16 tegn, så derfor prøver de md5 - og dermed har de funnet passordet. Å snu stringen er desverre ikke nok. Begynner du å endre på stringen, ved å f.eks. dele den i to eller flere deler og bytte plass på disse delene så er det verre å finne logikken - for da er den helt opp til deg å finne på. Hvis du har prøv bruteforce så tenker du kanskje at det er veldig mye jobb å bare snu et passord så det virker trygt å snu det to ganger. Men glem ikke at proffe hackere har systemer med flere maskiner som jobber sammen for å snu passord og rinowtables - så det stopper desverre ikke de. En annen viktig ting å merke seg er at dersom du lager et stort system som mange brukere skal bruke samtidig, så begynner det å bli en del jobb for serveren å hashe passord for mange ganger - det er desverre ulempen med sikkerhet - det er ressurskrevenede. Lenke til kommentar
arnizzz Skrevet 21. juli 2005 Forfatter Del Skrevet 21. juli 2005 Ja det er vel kanskje ikke noen stor ufordring for mesterne. Men det er da kanskje litt ekstra beskyttende for scriptkiddies som har brukt en eller annet SQL Injection exploit? Hva med å dele en sha1 streng i 4 deler og å kjøre bubblesortere de strengene? Og i tillegg dele opp den sorterte strengen i 5 deler og rote den skikkelig til:P. jeg får prøve å finne opp en "rotefunksjon". Og er det virkelig så ressurskrevende? Jeg testa en MD5-cracker her om dagen og min amd klarte godt over 5000 forsøk i sekundet. Brukte ikke lange tiden på å finne en streng på 4 tall. Men med en lengre streng og flere tegn så tok det _mye_ lengre tid. Lenke til kommentar
???????? Skrevet 21. juli 2005 Del Skrevet 21. juli 2005 Tenk deg dette, hvis du har en hash som ser slik ut: 529ca8050a00180790cf88b63468826a så deler du den opp slik: 529ca 8050a001 80790cf88b 63468826a og setter den sammen slik: 8050a001 529ca 63468826a 80790cf88b (uten mellomrom) Hvis da noen klarer å forstå mønsteret i den koden først og så bruteforce den så har du nok ikke mye sjanse uansett, da snakker du om så bra hackere at de like så gjerne hacker seg inn andre steder direkte på serveren (f.eks. SSH eller ftp). Jeg sier ikke nødvendigvis at kryptering flere ganger er dårlig, bare du gjøre noe mer også. Du velger jo selv den metoden du føler er tryggest. Lenke til kommentar
ZoRaC Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Hvor stor er sjansen for at PHP krasjer? Har aldri sett på det som noen risiko før, inntil det skjedde på serveren min i dag og plutselig kunne all PHP-kode leses som ren tekst! Hadde tilfeldigvis sikret config-filene min med .htaccess, så ingen passord er på avveie, men det var ren flaks... Lenke til kommentar
???????? Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Hvor ofte det skjer at PHP stopper å fungere er ikke lett å si, men at det skjer er det ikke tvil om. Et par ganger har jeg til og med sett at google.com har registrert sider som ikke har fungert, slik at man kan klikke på "i hurtigbuffer" for å lese PHP koden. Så lenge man er klar over at det risikoen er til stede og tar hensynt til dette så er det ingen fare. Det beste er å plassere filer med passord ol. utenfor public_html (www) mappen. Lenke til kommentar
Gjest Slettet+6132 Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Hvor ofte det skjer at PHP stopper å fungere er ikke lett å si, men at det skjer er det ikke tvil om. Et par ganger har jeg til og med sett at google.com har registrert sider som ikke har fungert, slik at man kan klikke på "i hurtigbuffer" for å lese PHP koden. Så lenge man er klar over at det risikoen er til stede og tar hensynt til dette så er det ingen fare. Det beste er å plassere filer med passord ol. utenfor public_html (www) mappen. Eller bruke .htaccess til å bare tillate localhost å lese dem Lenke til kommentar
???????? Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Da kan man likeså gjerne kun legge de i en mappe som er pasordbeskyttet med .htaccess (eller endre rettigheter CHMOD), som jeg skrev ovenfor. Begge disse løsningene er enklere for brukere, CHMOD er tilgjenlig i de fleste ftp programmer, og de fleste kontrollpanel på webhoteller har passordbeskyttelsesfunksjoner med .htaccess. Måten er ikke det viktigste, bare man husker å gjøre det! Lenke til kommentar
Torbjørn Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 ser ingen grunn til at localhost skal få lese filene en gang. de bør sperres for alle gjennom http Lenke til kommentar
oblomsoe Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Jeg er litt ny på php.. Men hvordan kan jeg få til å dele opp og flytte på tingene? Og er det smart å ta med brukernavnet cryptert i passordet? Satt litt å prøvde ut etter at jeg leste litt av denne tråden.. Er dette sikkert?: if($_POST['brukernavn'] && $_POST['passord']){ include ("../config.php"); $brukernavn=$_POST['brukernavn']; //Krypterer passordet $salt1="6emtnytk93n9zbft" $salt2=crypt(sha1(md5($_POST['brukernavn']))) $passord = crypt(sha1(md5($salt1 . $_POST['passord'] . $salt2))); Og er det noen vits å gjøre det samme med brukernavnet? Alltså å kryptere bruker navnet? Og leste i en annen tråd at det var smart å bruke ip osv i sessions.. Hvordan får man til det? Takk Lenke til kommentar
ZoRaC Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Hva chmodder jeg til for at PHP skal kunne inkludere filen, men den kan ikke åpnes i en browser? Lenke til kommentar
arnizzz Skrevet 22. juli 2005 Forfatter Del Skrevet 22. juli 2005 Jeg er litt ny på php.. Men hvordan kan jeg få til å dele opp og flytte på tingene?Og er det smart å ta med brukernavnet cryptert i passordet? Satt litt å prøvde ut etter at jeg leste litt av denne tråden.. Er dette sikkert?: if($_POST['brukernavn'] && $_POST['passord']){ include ("../config.php"); $brukernavn=$_POST['brukernavn']; //Krypterer passordet $salt1="6emtnytk93n9zbft" $salt2=crypt(sha1(md5($_POST['brukernavn']))) $passord = crypt(sha1(md5($salt1 . $_POST['passord'] . $salt2))); Og er det noen vits å gjøre det samme med brukernavnet? Alltså å kryptere bruker navnet? Og leste i en annen tråd at det var smart å bruke ip osv i sessions.. Hvordan får man til det? Takk Ta en titt på denne siden: http://no2.php.net/reserved.variables 'REMOTE_ADDR' . Men jeg tror ikke IP-sjekking er en bra måte for å verifisere at det er samme person. Enkelte ISPer gjør at brukere kan få forskjellige ip-adresse for hver HTTP-request. Men vet ikke helt om dette er noe stort problem i norge. å sjekke for browsertype tror jeg er bedre. Det er rimelig sikkert at brukeren ikke bytter browser inne på siden. Og i så fall om han gjør det kan du bare prompte for å skrive inn nytt passord . Men det er også mulig for brukeren å skru av httpheadere som gjør at du kan lese browser adressen. Så derfor burde det ikke auth-scriptet basere seg på at brukeren gjør det. Men HVIS du får browser-typen, så kan du legge til. Håper det ikke var så alt for dårlig forklart. Og tilbake til salting. Slik som jeg gjorde det, var å bruke ID og Date sammens med noen mattefunksjoner. Deretter gjorde jeg om tallet til en streng, og delte strengen i to. Den ene halvparten gjorde jeg om til bokstaver, mens den andre forble som tall. Deretter spleisa jeg de sammen slik at jeg fikk to strenger med en blanding av tall og bokstaver på hver side av passordet. Kommentarer? Lenke til kommentar
Gjest Slettet+6132 Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 Jeg er litt ny på php.. Men hvordan kan jeg få til å dele opp og flytte på tingene?Og er det smart å ta med brukernavnet cryptert i passordet? Satt litt å prøvde ut etter at jeg leste litt av denne tråden.. Er dette sikkert?: if($_POST['brukernavn'] && $_POST['passord']){ include ("../config.php"); $brukernavn=$_POST['brukernavn']; //Krypterer passordet $salt1="6emtnytk93n9zbft" $salt2=crypt(sha1(md5($_POST['brukernavn']))) $passord = crypt(sha1(md5($salt1 . $_POST['passord'] . $salt2))); Og er det noen vits å gjøre det samme med brukernavnet? Alltså å kryptere bruker navnet? Og leste i en annen tråd at det var smart å bruke ip osv i sessions.. Hvordan får man til det? Takk å bare sette post-variablene direkte inn er ikke alltid så lurt heller Lenke til kommentar
oblomsoe Skrevet 22. juli 2005 Del Skrevet 22. juli 2005 (endret) Tusen takk! Men finnes det andre måter å kryptere passord på en crypt() md5() og sha1()? Edit: Fant ut nå at det var mulig med md2, md4, og sha2.. Men er det flere en dette? Edit2: Men fikk denne feilen når jeg prøvde med md2:Fatal error: Call to undefined function: md2() in /var/www/vhosts/megaspill.net/httpdocs/test/nybrukeraction.php on line 16. Og samme på md4: Fatal error: Call to undefined function: md4() in /var/www/vhosts/megaspill.net/httpdocs/test/nybrukeraction.php on line 16 Og Fatal error: Call to undefined function: sha2() in /var/www/vhosts/megaspill.net/httpdocs/test/nybrukeraction.php on line 16 på sha2. Funker ikke disse å bruke alikavell? Trodde det funka siden de ble higligta blått i code editoren.. Endret 22. juli 2005 av oblomsoe Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå