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-28, 09:51 | #6 | |||
|
||||
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 | #7 | ||
|
|||
Har WN som tidsfördriv
|
Citat:
|
||
Svara med citat |
2011-07-28, 13:05 | #8 | |||
|
||||
Mycket flitig postare
|
Citat:
http://www.itnewb.com/v/Encrypting-P...BKDF2-Standard |
|||
Svara med citat |
2011-07-31, 00:29 | #9 | |||
|
||||
Administratör
|
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. |
|||
Svara med citat |
2011-07-27, 20:46 | #10 | ||
|
|||
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 |
Svara |
|
|