Avatar billede egebos Nybegynder
16. juli 2008 - 22:36 Der er 12 kommentarer og
1 løsning

SQL injection, er denne kode sikker?

$select_auth = mysql_query("SELECT * FROM brugere WHERE brugernavn='$_GET[bruger]'");
$row_auth = mysql_fetch_array($select_auth);

if( $row_auth[id] )
{
  //bruger findes
  if( $row_auth[kode] == $_GET[kode] )
  {
      //rigtig kode
  }
  else
  {
      //forkert kode
  }
}
else
{
  //bruger findes ikke
}


Jaa, spørgsmålet er om denne kode er sikker for SQL injections :)
Tak på forhånd.
Avatar billede fbisen Nybegynder
16. juli 2008 - 22:50 #1
Nej. Koden er ikke sikker.

$_GET[bruger] = mysql_real_escape_string($_GET[bruger]);
$select_auth = mysql_query("SELECT * FROM brugere WHERE brugernavn='$_GET[bruger]'");

Burde hjælpe på det :)
Avatar billede Slater Ekspert
16. juli 2008 - 22:50 #2
Nej. Det er den aldrig, når du putter _GET og _POST variabler direkte ind i SQL-udtryk, med mindre det er prepared statements.

$bruger = mysql_real_escape_string($_GET['bruger']);
$select_auth = mysql_query("SELECT * FROM brugere WHERE brugernavn=$bruger");
- Vil være det mindste du skal gøre.
Avatar billede Slater Ekspert
16. juli 2008 - 22:50 #3
Well, 40 sekunder for sent :P
Avatar billede fbisen Nybegynder
16. juli 2008 - 22:51 #4
Foresten er det ikke korrekt at skrive

$_GET[bruger]
Det burde være
$_GET['bruger']

Hvis du har sat din konfiguration til rapportere alle fejl (E_ALL), ville det give en warning/notice.
Avatar billede fbisen Nybegynder
16. juli 2008 - 22:51 #5
Hehe :)
Vi arbejder hurtigt her :)
Det var også al din forklaring :P :P
Avatar billede egebos Nybegynder
16. juli 2008 - 22:52 #6
Hvis den ikke er sikker, hvordan vil man så kunne fks. DROP TABLE brugere?
Avatar billede fbisen Nybegynder
16. juli 2008 - 23:00 #7
Jeg mener ikke at man kan droppe table her, da mysql_query kun tager imod én statement.

Det er dog ikke en sikker måde du har gjort det på. Hvis en bruger f.eks skriver
'; DROP TABLE brugere;'
Ville det sådan her ud:
SELECT * FROM brugere WHERE brugernavn=''; DROP TABLE brugere;''

Jeg tror ikke det vil virke, fordi mysql_query som sagt vidst kun tager én query ad gangen. Han kan dog også skrive andet
' or PASSWORD = 'gætetkodeord'
SELECT * FROM brugere WHERE brugernavn='' or PASSWORD = 'gætetkodeordsomenellerandetbrugerhar'
Avatar billede egebos Nybegynder
16. juli 2008 - 23:05 #8
Ok, tak for hjælpen, så får du point :)
Avatar billede fbisen Nybegynder
16. juli 2008 - 23:08 #9
I princippet er din kode rimelig sikker. Men hellere være helt sikker en ked af det "Better safe than sorry" :)
Avatar billede coderdk Praktikant
16. juli 2008 - 23:28 #10
Hvis $_GET['bruger'] f.eks er:

' OR 1=1

;)
Avatar billede fbisen Nybegynder
17. juli 2008 - 09:38 #11
Det kunne man godt skrive, men det får man desværre ikke meget ud af. Jo, den selecter alle brugere, men bagefter i koden tjekker han også om kodeordet er det samme som den selectede bruger.
Det skulle vidst også have været ' OR '1=1

Men ja, hvorfor skulle man tænke så abstrakt, når man lige så godt bare kan sikre koden 100% mod injections med et enkelt funktionskald.
Avatar billede olebole Juniormester
17. juli 2008 - 21:53 #12
<ole>

Brug mysqli. Der skal rigtig gode grunde til at blive hængende i mysql i 2008 ... og de er ikke så lette at finde  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
17. juli 2008 - 21:54 #13
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester