Lidt $_GET sikkerhed og andet!

Tags:    php

<< < 123 > >>
Hej udviklere

Jeg er igang med at lave et community system til Travian.dk, men før jeg offentliggøre det hele, vil jeg gerne have sikkerheden i orden.

Her på Udvikleren har jeg læst lidt om sikkerhed, og læste også om noget jeg ikke har hørt om før - at man kan få ødelagt en hel del, ret simpelt i $_GET. Hvis vi nu siger jeg har et artikelsystem der kører på "artikel.php?id=tal", fik jeg at vide at man kan skrive noget ala:
"artikel.php?id=DROP TABLE artikler;" eller sådan noget, og så ryger det hele jo.
Hvordan kan man undgå dette?

Og har også læst lidt om SQL injections med brugerinputs. Men nogle snakker om addslashes, og andre om et eller andet ala mysql_real_escape_string eller sådan noget. Men er addslashes da ikke nok?

Og så vil jeg lige høre:
Alt i alt, vil I så sige at det er fin sikkerhed ved at community med at jeg md5(sha1()) password, gør det der med $_GET med artikel og det med addslashes? Er det nok sikkerhed, synes I? Eller mangler der noget?

ALT hvad der har med sikkerhed at gøre, kom med det. Gerne bare LIDT forklaring, og ellers bare et eksempel.

MVH
Alexander :-)






21 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
htmlentities er noget man bruger før man udskriver noget tekst på side, for at være sikker på at den fortolkes som tekst, og ikke HTML. Man kan bruge htmlspecialchars i stedet for htmlentities. htmlspecialchars gør det samme som htmlentities, men den er bare hurtigere. Det er vigtigt at brugeren ikke kan skrive HTML på siden, blandt andet for at forhindre, at brugeren kan skrive Javascript på siden og derved snyde andre brugere.

addslashes er noget man bruger, før man indsætter tekst i en SQL query. Man kan bruge mysql_real_escape_string i stedet for, som er mere korrekt, da den tager højde for tegnsæt mm.

htmlspecialchars bruges når man vil udskrive tekst på siden, mysql_real_escape_string bruges når man vil indsætte tekst i databasen. Det vil sige at de to funktioner ikke skal bruges på samme streng, som i Per Sikker Hansens eksempel.

Du skal ikke bruge både md5 og sha1. Vælg en af dem. Det bliver ikke mere sikkert af at bruge dem begge.

Lige i tilfældet med id, vil jeg ikke anbefale at escape din get-variabel. Her bør du i stedet sikre dig, at det er et tal:

$id = (int) $_GET['id'];

Dette sikrer effektivt mod "DROP TABLE artikler;", da dette ikke er et tal.

Et alternativ til mysql_real_escape_string, som jeg personligt bedre kan lide, er prepared statements. Her undgår du fuldstændig problemet omkring sql injection, da du ikke sammensætter queryen af forskellige brugerinput. PHP's mysql_* ( http://php.net/mysql ) og mysqli_* ( http://php.net/mysqli ) har dog ringe understøttelse af prepared statements, så hvis du vil bruge dem, bør du nok skifte til PDO ( http://php.net/pdo ), hvilket kræver PHP 5.1



Indlæg senest redigeret d. 25.03.2007 16:00 af Bruger #3143
htmlentities er noget man bruger før man udskriver noget tekst på side, for at være sikker på at den fortolkes som tekst, og ikke HTML. Man kan bruge htmlspecialchars i stedet for htmlentities. htmlspecialchars gør det samme som htmlentities, men den er bare hurtigere. Det er vigtigt at brugeren ikke kan skrive HTML på siden, blandt andet for at forhindre, at brugeren kan skrive Javascript på siden og derved snyde andre brugere.

addslashes er noget man bruger, før man indsætter tekst i en SQL query. Man kan bruge mysql_real_escape_string i stedet for, som er mere korrekt, da den tager højde for tegnsæt mm.

htmlspecialchars bruges når man vil udskrive tekst på siden, mysql_real_escape_string bruges når man vil indsætte tekst i databasen. Det vil sige at de to funktioner ikke skal bruges på samme streng, som i Per Sikker Hansens eksempel.


Effekten er den samme.


Du skal ikke bruge både md5 og sha1. Vælg en af dem. Det bliver ikke mere sikkert af at bruge dem begge.


Ikke helt korrekt. md5 er det mest normalt brugte. md5 kan desuden nemt omgås. En ven af mine satte sin maskine til at udregne md5-summen på alle strenge på op til 8 tegn, og gemte disse i en tekstfil. Da den omsider var færdig, havde han dermed en ret omstændig database over hvilke strenge der blev til hvad.

Ergo ville enhver ondsindet cracker kunne, har vedkommende snilde nok, kunne skaffe sig det md5'ede password, og søge på strengen i sin liste over muligheder, og finde et match. Tjubang, så er der passwordexploit.

Ved at bruge både sha1 og md5 kan man snyde denne cracker godt og grundigt.


Lige i tilfældet med id, vil jeg ikke anbefale at escape din get-variabel. Her bør du i stedet sikre dig, at det er et tal:

$id = (int) $_GET['id'];

Dette sikrer effektivt mod "DROP TABLE artikler;", da dette ikke er et tal.


At escape sin $_GET variabel er stadig en generelt god idé, da man sagtens kan komme ud for at skulle bruge tekststrenge i sin variabel, og ikke kun integers.


Et alternativ til mysql_real_escape_string, som jeg personligt bedre kan lide, er prepared statements. Her undgår du fuldstændig problemet omkring sql injection, da du ikke sammensætter queryen af forskellige brugerinput. PHP's mysql_* ( http://php.net/mysql ) og mysqli_* ( http://php.net/mysqli ) har dog ringe understøttelse af prepared statements, så hvis du vil bruge dem, bør du nok skifte til PDO ( http://php.net/pdo ), hvilket kræver PHP 5.1


At gøre det på den anden måde, med addslashes, sikrer bagudkompatibilitet. mysql(_real)_escape_string er forholdsvis ny. Bortset fra at mysql_escape_string findes i PHP4, i de ret tidlige versioner. Men jeg har flere gange været ude for webhoteller der kørte med tidligere versioner af PHP4.



har du kigget på om du har slået mysql magic quotes til?

hvis du har det... er der ingen behov for sikkerhed på din SQL ;)

jeg vil forslå at bruge...

$id = (int) $_GET['id'];
htmlspecialchars
addslashes



Indlæg senest redigeret d. 25.03.2007 20:48 af Bruger #11553
Nu bruger jeg selv noget ligende, vil i mene at en kode som denne her sikre imod ødelæggende indhold?

Jeg har på en simpel måde bare lavet en IF statement, for at sikre at indputtet er et tal.

Fold kodeboks ind/udKode 


Således vil der bare ikke blive gjort noget som helst hvis verdien ikke er større end "0", og for at være større end "0" skal verdien jo være et tal. eller tager jeg fejl?
hvis brugeren så har skrævet et andet input fx i browserens adresse linje, så skulle der ikke ske noget.. eller tager jeg fejl?

Ville gerne have bekraftet det, jeg er nemlig igang med at udvikle en større side som bruger $_GET en hel del.



"artikel.php?id=DROP TABLE artikler;" det er SQL injections. Og et community udden addslashes og andet som fjerner brugerens mulighed for at lave et rent '-tegn i en eller anden form for input, er ganske enkelt dumt. Men der skal ikke meget til for at fjerne denne mulighed. En enkel PHP funktion eller to, så er man i sikkerhed.



Så du siger altså at addslashes er fint nok til brugerinputs, som tagwall, eller filtekst?

Men hvordan får jeg så STOPPET det med "id=DROP TABLE artikel"??




jeg bruger følgende funktion til at sikre mig:

Fold kodeboks ind/udKode 


og så kører jeg simpelthen bare alt der skal i en SQL-sammenhæng, der vel at mærke kommer fra brugeren, igennem create_input($string);

Hvis du gør det på dine $_GET variabler også, får du effektivt stoppet alt.

Hvis du skal have noget ud af din database igen, skal du selvfølgelig lige køre en

stripslashes($string); for at fjerne \\'erne fra den igen.



Indlæg senest redigeret d. 25.03.2007 13:13 af Bruger #8223
Betyder "htmlentities" at brugere ikke kan bruge HTML i deres inputs?

Og hvordan vil du så stille det med $_GET op? da det jo forgår oppe i adressefeltet, kan jeg ikke helt se hvordan det skal se? :S



Indlæg senest redigeret d. 25.03.2007 13:31 af Bruger #11195
Betyder "htmlentities" at brugere ikke kan bruge HTML i deres inputs?

Og hvordan vil du så stille det med $_GET op? da det jo forgår oppe i adressefeltet, kan jeg ikke helt se hvordan det skal se? :S


htmlentities betyder ganske rigtigt at brugere ikke kan bruge html i deres inputs. Dette frahjælper dig også problemer med uønsket JavaScript fra brugere. Husk på at JavaScript både kan indsamle info fra cookies og sende emails, samt gøre siden fuldstændigt ubrugelig.

Det andet, er da sindssygt enkelt?

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 25.03.2007 13:40 af Bruger #8223
Dobbeltpost



Indlæg senest redigeret d. 25.03.2007 15:59 af Bruger #3143
<< < 123 > >>
t