FAQ |
Kalender |
2011-07-27, 14:03 | #1 | |||
|
||||
Medlem
|
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) ?> |
|||
Svara med citat |
2011-07-27, 15:42 | #2 | ||
|
|||
Medlem
|
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) |
||
Svara med citat |
2011-07-27, 15:49 | #3 | |||
|
||||
Medlem
|
Låter ju vettigt. Vart placerar jag in detta?
|
|||
Svara med citat |
2011-07-27, 16:54 | #4 | ||
|
|||
Medlem
|
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))); 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 |
||
Svara med citat |
2011-07-27, 20:04 | #5 | ||
|
|||
Har WN som tidsfördriv
|
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:
|
||
Svara med citat |
2011-07-27, 20:46 | #6 | ||
|
|||
Medlem
|
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. |
||
Svara med citat |
2011-07-27, 21:44 | #7 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
Svara med citat |
2011-07-27, 21:53 | #8 | ||
|
|||
Medlem
|
Citat:
Jag tycker dessutom man skall använda Mysqlnd i PHP och då går PDO mig veterligen bort. |
||
Svara med citat |
2011-07-28, 09:51 | #9 | |||
|
||||
Mycket flitig postare
|
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); |
|||
Svara med citat |
2011-07-28, 12:42 | #10 | ||
|
|||
Har WN som tidsfördriv
|
Citat:
|
||
Svara med citat |
Svara |
|
|