WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   mysql_real_escape_string - Gör jag rätt? (https://www.wn.se/forum/showthread.php?t=1049264)

Hellsing 2011-07-27 14:03

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)
?>


Kekke 2011-07-27 15:42

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)

Hellsing 2011-07-27 15:49

Låter ju vettigt. Vart placerar jag in detta?

znap 2011-07-27 16:54

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! :)

youheardit 2011-07-27 20:04

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!

Jake.Nu 2011-07-27 20:46

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.

Magnus_A 2011-07-27 21:44

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.

Jake.Nu 2011-07-27 21:53

Citat:

Ursprungligen postat av Magnus_A (Inlägg 20412876)
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.

SimonP 2011-07-28 09:51

Citat:

Ursprungligen postat av youheardit (Inlägg 20412869)
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);

youheardit 2011-07-28 12:42

Citat:

Ursprungligen postat av SimonP (Inlägg 20412904)
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. :)


Alla tider är GMT +2. Klockan är nu 20:29.

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