Kom ihåg mig?
Home Menu

Menu


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-28, 09:51 #6
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 #7
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
Oläst 2011-07-28, 13:05 #8
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
Okej, var annat att höra. Har hört det jag sa tidigare. Men tack för informationen.
Det beror visserligen på vem man vill skydda sig mot, men vill man skydda sig mot lite mer avancerade offline GPU-bruteforce attacker så måste man iterera hashningen (eller strängen). De flesta webbkodare missar att skydda sig mot bruteforce, jag tycker man man bör utgå ifrån att någon obehörig kan få tag i lösenordshashen, och därför skydda hashen ordentligt. PBKDF2 är en bra KDF för lösenord, flera kända program som t.ex Mozilla och Truecrypt använder den.

http://www.itnewb.com/v/Encrypting-P...BKDF2-Standard
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-31, 00:29 #9
Alexs avatar
Alex Alex är inte uppkopplad
Administratör
 
Reg.datum: Sep 2004
Inlägg: 1 621
Alex Alex är inte uppkopplad
Administratör
Alexs avatar
 
Reg.datum: Sep 2004
Inlägg: 1 621
Citat:
Ursprungligen postat av youheardit Visa inlägg
Okej, var annat att höra. Har hört det jag sa tidigare. Men tack för informationen.
Fast ditt salt gör ju ingen nytta när det finns i "klartext" utanför hashningen. Har man tabellen har man ju också saltet.
__________________
@Zn4rK - Börja blogga - Paintball i Göteborg
Det jag skriver är mina personliga åsikter och återspeglar inte vad WN eller andra företag jag representerar tycker.
Alex är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-07-27, 20:46 #10
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
Svara


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

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 17:11.

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