Bu PHP kayıt kodu herhangi bir güvenlik açıkları var mı?

6 Cevap php

Can you experts give me some thougths on this code? Some security hole i have missed? Can you see any potential threats? Something i can do better?

Ben hala :) Teşekkürler öğreniyorum

<?php

if (isset($_POST['username'])) {

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$password2 = mysql_real_escape_string($_POST['password2']);
$encrypted_password = md5($password);


// remove eventuakl space
foreach($_POST as $key => $val) $_POST[$key] = trim($val);


// check if username is taken
$query = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username'");
if (mysql_result($query, 0) > 0) {
$reg_error[] = 0;
}

// make sure username only cosist of at least 3 letters, numbers or _ -
if (!preg_match('/^[a-zA-Z0-9_-]{3,}$/', $username)) {
$reg_error[] = 4;  
}


// check for empty fields
if (empty($username) || empty($password) || empty($password2)) {
$reg_error[] = 2;
}

// check if the passwords match
if ($password != $password2) {
$reg_error[] = 3;
}

// save if error is unset
if (!isset($reg_error)) {
mysql_query("INSERT INTO users (username, password, registered, registration_ip)
             VALUES('$username', '$encrypted_password', '".time()."', '".$_SERVER['SERVER_ADDR']."')");

$_SESSION['id'] = mysql_insert_id();
header('refresh: 3; url=/home');

}


}
?>

Login.php

if (isset($_POST['username'])) {

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$md5_password = md5($password); 

$query = mysql_query("SELECT id FROM users WHERE username = '$username' and password = '$md5_password'");


if (mysql_num_rows($query) == 0) {
header("Location: ".$_SERVER['REQUEST_URI']."");
exit;
}

// set session
$_SESSION['id'] = mysql_result($query, 0, 'id');
header("Location: /");
exit;

6 Cevap

Sen salt şifre vermedi.

Ayrıca, md5() şifreler karma için not strong enough kabul edilir.

hash('sha256', $password) kullanmak yerine.

Eğer değilseniz, kullanıcı adı ve net olarak açık net şifre seyahat, ve bu kesinlikle çok güvenli değil - Eğer yapmak isteyip söz yok gerçi, https bu hizmet ediyoruz varsayalım.

Bir yarış durumu var - Eğer kullanıcı adı ilk alınır, ancak daha sonra bunu eklerim olup olmadığını kontrol edin. Eğer bir işlem, en az kullanın ve ideal sadece (veritabanı tarafından dayatılan teklik kısıtlaması ile) takın ve çiftleri durumunda hatayı yakalamaya çalışmalısınız. Ve, yani birbirlerinden mümkün çiftleri, kayıt girişimi Tamam, kendinizi ikna ettik yalnızca after diğer tüm aklı denetler, bunu yapmanız gerekir.

Eğer kullanıcı adı geçerliliği için kontrol etmiyoruz bu yana çok az bobby tables baş ağrısı bir çok verecektir.

Sen tuz için şifre gerekir.

Bu yanlış yere yerleştirilir. $ _POST Değişkenler kullanılmadan önce bir kaç satır yukarı hareket ettirin.

// remove eventuakl space
foreach($_POST as $key => $val) $_POST[$key] = trim($val);

Sen hiçbir nedenle şifre alanlarını kaçan. Onlar veritabanına gönderilen değildir. md5 ($ parola) veritabanına gidiyor ve kaçtı değildir.

EDIT: giriş tarafında, sen kayıt tarafında süs olan bir şey kırparak edilmelidir.

Sizin hata denetimi amacıyla çıktı. Ben bu sırayla kontrol hatayı yapardı:

  1. Boş alanların kontrol edin
  2. Alanların geçerli değerler (filtreleme giriş) sahip olduğunu kontrol edin
  3. SQL alanları kullanmadan önce mysql_real_escape_string ile alanları Kaçış
  4. SQL tablosu kullanıcı için kontrol edin

Eğer bir hata bulursanız, başka kontrollere devam etmeyin. Son INSERT deyimi üzerinde nöbet benzer her hata kontrolü koru.

Sen mysql_real_escape_string kullanarak yanı sıra şifre alanlarını hiçbir düzenlemeler var mı?

Sen mysql_real_escape_string kullanmadan önce mysql_connect yapmalıdır. mysql_real_escape_string bağlantı karakter kümesini belirlemek için bağlantınızı kullanır. Karakter kümesi kaçmak için hangi karakterlerin belirleyecektir.

Bunun yerine dinamik sql bina parametrelerini kullanmalısınız. Bu SQL enjeksiyon saldırıları önlemek yardımcı olacaktır. Küçük Bobby tablolar alırsınız.