Kom ihåg mig?

mysql_real_escape_string - Gör jag rätt?

 
Ämnesverktyg Visningsalternativ
Oläst 2011-07-27, 14:03 #1
Hellsings avatar
Hellsing Hellsing är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 194
Hellsing Hellsing är inte uppkopplad
Medlem
Hellsings avatar
 
Reg.datum: Aug 2007
Inlägg: 194
Standard mysql_real_escape_string - Gör jag rätt?

Hej!

Jag är TOTALT värdelös på att programmera, men har lyckats att knåpa ihop ett PHP-formulär för registrering av användare där jag vill implementera mysql_real_escape_string för att undvika SQL-injection.

Har jag gjort rätt? Hur kan jag testa att det fungerar?

Kod:
<?php

$con = mysql_connect("DB-SERVER","MIN-USER","MITT-PASS");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("MIN-DB", $con);

$grupp = "2";
$okrypterat = mysql_real_escape_string($_POST['Losenordet']);
$salt = "ETT-STATISKT-SALT";
$krypterat = md5($okrypterat.$salt).':'.$salt;
$datum = date("Y-m-d H:i");

$Namnet = mysql_real_escape_string($_POST['Namnet']);
$UNamnet = mysql_real_escape_string($_POST['UNamnet']);
$Eposten = mysql_real_escape_string($_POST['Eposten']);

$sql="INSERT INTO TABELL1 (name, password, username, email, usertype, registerDate)
VALUES
('$Namnet','$krypterat','$UNamnet','$Eposten','$grupp','$datum')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }

$anvid = mysql_insert_id();

$sql="INSERT INTO TABELL2 (user_id, group_id)
VALUES
('$anvid','$grupp')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }

echo "Account created.  You can now login";

mysql_close($con)
?>
Hellsing är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 15:42 #2
Kekke Kekke är inte uppkopplad
Medlem
 
Reg.datum: Feb 2011
Inlägg: 198
Kekke Kekke är inte uppkopplad
Medlem
 
Reg.datum: Feb 2011
Inlägg: 198
Du bör köra en regex så att man inte kan skriva in html taggar i username,

Kod:
preg_match('/^[a-z\d_]{5,20}$/i', $username)
Kekke är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 15:49 #3
Hellsings avatar
Hellsing Hellsing är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 194
Hellsing Hellsing är inte uppkopplad
Medlem
Hellsings avatar
 
Reg.datum: Aug 2007
Inlägg: 194
Låter ju vettigt. Vart placerar jag in detta?
Hellsing är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 16:54 #4
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
För att få ned koden några rader och slippa dubbellagra alla variabler som redan ligger i POST så kan du direkt efter anslutningen till databasen köra
Kod:
  foreach($_POST as $key=>$val)
    $_POST[$key] = mysql_real_escape_string(strip_tags(trim($val)));
Då har du tagit bort eventuella blanksteg i början och slutet på strängen, strippat bort eventuella html-taggar och försökt skydda dig mot sql-injektioner. (lösenordet bör dock krypteras före detta, du behöver då inte anropa mysql_real_escape_string)

Sen efter det kan du jobba direkt med $_POST[..] och behöver inte lagra om variablerna på nytt, vilket jag kan tycka är helt onödigt i det här fallet.

Sen är det vanligt förekommande såväl bland nybörjare som bland mer erfarna programmerare att man helt struntar i att följa en vedertagen kodkonvention. Googla på något i stil med "coding convention php" eller "coding standards php". Vänj dig heller inte vid att skriva variabel/funktionsnamn på svenska.

Annars så är du ju på gång, bara att forsätta knacka!

Senast redigerad av znap den 2011-07-27 klockan 16:57
znap är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 20:04 #5
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
Tycker du fått bra svar hittils och koden ser bra ut. Men en sak jag tycker du bör göra är att lägga till lite sha1 salt på md5-hashet. dvs:
PHP-kod:
$krypterat sha1(md5($okrypterat.$salt)).':'.$salt
Då är krypteringen totalt obrytbar!
youheardit är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 20:46 #6
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
md5 och sha1 är ingen kryptering, det är hashfunktioner (kan uppenbarligen aldrig upprepas tillräckligt många gånger).
Sen ser jag ingen anledning till att inte använda MySQLi och "prepared statements" istället.

Att köra strip_tags(), htmlspecialchars(), trim(), etc, etc på data är ytterligare en åtgärd.
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 21:44 #7
Magnus_As avatar
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
Magnus_As avatar
 
Reg.datum: May 2006
Inlägg: 2 604
Använd PDO, för böfvelen! Då blir koden vattentät mot injektionsförsök.

http://php.net/manual/en/book.pdo.php

Fördelar:
Säkerhet från injektioner.
Bra struktur på kod.
Återanvändbar kod.

Ser lite bökigt ut till en början, men man vänjer sig fort. Passar utmärkt om man vill jobba vidare mot en mer objektorienterad kodning.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 21:53 #8
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Citat:
Ursprungligen postat av Magnus_A Visa inlägg
Använd PDO, för böfvelen! Då blir koden vattentät mot injektionsförsök.

http://php.net/manual/en/book.pdo.php

Fördelar:
Säkerhet från injektioner.
Bra struktur på kod.
Återanvändbar kod.

Ser lite bökigt ut till en början, men man vänjer sig fort. Passar utmärkt om man vill jobba vidare mot en mer objektorienterad kodning.
Nja, varför PDO och inte MySQLi? Någon form av portabel idé kanske..? Gör snarare så att du har ett interface mot SQLdatabas(en) och därigenom implementerar du det backend som behövs.
Jag tycker dessutom man skall använda Mysqlnd i PHP och då går PDO mig veterligen bort.
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-28, 09:51 #9
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
Citat:
Ursprungligen postat av youheardit Visa inlägg
Då är krypteringen totalt obrytbar!
Bruteforce fungerar nästan lika bra mot SHA1(MD5(pass.salt)) som mot MD5(pass.salt). Det krävs key stretching (eller annan KDF) för att man skall få bra säkerhet och ett praktiskt skydd mot bruteforce, t.ex:
for ($i=0; $i < 1000; $i++) $hash .= $pass.$salt;
$hash=SHA1($hash);
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-28, 12:42 #10
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
youheardit youheardit är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2008
Inlägg: 1 168
Citat:
Ursprungligen postat av SimonP Visa inlägg
Bruteforce fungerar nästan lika bra mot SHA1(MD5(pass.salt)) som mot MD5(pass.salt). Det krävs key stretching (eller annan KDF) för att man skall få bra säkerhet och ett praktiskt skydd mot bruteforce, t.ex:
for ($i=0; $i < 1000; $i++) $hash .= $pass.$salt;
$hash=SHA1($hash);
Okej, var annat att höra. Har hört det jag sa tidigare. Men tack för informationen.
youheardit är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:31.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017