php kimlik doğrulama komut dosyası

2 Cevap php

Ben aşağıdaki kimlik doğrulama komut bitmiş gerekir. Ben bu yüzden bir tane eşit ve daha sonra sorgu sonuçlarından oturum id ayarı satır sayısı için sormak nasıl bilmiyorum php / pdo de zayıfım. Ben sonuçlarından de $ _SESSION ['kimliği'] aynı zamanda ['şirket'] set ve ['security_id'] değil gerekiyor.

burada ne var:

$userid   = $_POST['userid'];
$password = $_POST['pass'];
if ( $userid != "" || $password != "" )
{
  $sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'";
  $result = $dbh->query( $sql );
} else
{
  echo "login failed. Your fingers are too big";
}

Optional Information: Browser: Firefox

2 Cevap

DO NOT EVER USE THAT CODE!

Orada açık çok ciddi bir SQL enjeksiyon var. Aldığın her kullanıcı girişi, kurabiye veya CGI, ya da wherever, must be sanitized olup gelen bir SQL deyiminde kullanılan önce. Ben kolayca gibi bir kullanıcı adı ile bir giriş çalışarak bu sisteme girmeye olabilir:

user'; UPDATE contractors SET password = '1337'

Sonra herkes gibi giriş olabilir ... bundan sonra. Üzgünüm agresif gelebilir, ama ne bu kodu yapar belki hatta bir alarm sistemi içermiyor şirket haline ön kapıyı kilitlemek için unutmak gibi eğer.

Bu giriş aslında (belki de bir, önceden doldurulmuş gizli öyle) kullanıcıdan gelen ya da değil farketmez unutmayın. Bakış güvenlik açısından, anything o has kullanıcı tarafından zararlı girişi içeren kabul edilmesi dışında herhangi bir yerde geliyor.

Bildiğim kadarıyla, sen quote function of PDO to properly sanitize the string. (In mysql, this would be done with mysql_real_escape_string().) I'm not an expert on PDO, mind you, somebody please correct if I'm wrong here. kullanmanız gerekir

Ayrıca muhtemelen doğrudan veritabanında herhangi şifreleri saklamak değil, o zaman da kullanıcı sağlanan parola bir karma oluşturmak, maskeli bir parola oluşturmak için bir karma işlev kullanmak ve sağlamalarının maç olmamalıdır. Bunu yapmak için PHP hash işlevini kullanabilirsiniz.

SQL SELECT sahip yaklaşım iyi yaklaşım ise diğer konularda olduğu gibi, bilmiyorum. Ben sadece gelen kullanıcının şifre belirleyin ve programda o eşleşen denemek istiyorum. Ben birini kullanıyorsanız yöntemde herhangi bir arıza var sanmıyorum, ama o kadar mantıklı görünmüyor ve bu nedenle bazı hata eksik me daha büyük bir şansı var - hangi şifreleri durumunda ve giriş açıkları için bir pencere yaratacak.

O yolu yapmak için, fark etmeniz gerekir PDO query is a PDOStatement , that doesn't seem to have a reliable function to diretly count the amount of result rows. What you need to use is fetchAll alıyorsanız sonuç hangi bir satır dizi ve saymak döndürür. Ancak, ben bu başarısızlık için açık gibi bu tüm bana geliyor, bu yüzden kod şifreyi kontrol güvende hissederim dedi. Böyle bir güvenlik-kritik yerde benim tatmak için gerçek şifre eşleşen compasion, sadece çok mesafe var.

Ee, kullanıcı'kimliği için, sütun isimleri dayalı bir ilişkisel dizi onları almak için PDOStatement en fetch() which returns the contents of the column from the result. Use for example PDO::FETCH_ASSOC kullanabilirsiniz çıkan şifre alabilirsiniz.

İşte bunu düzeltmek için:

$userid_dirty   = $_POST['userid'];
$password_dirty = $_POST['pass'];
$success = false; // This is to make it more clear what the result is at the end
if ($userid != "" || $password != "") {
  $userid = $dbh->quote($userid_dirty);
  $passwordhash = hash('sha256',$password_dirty);
  $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid;
  $result = $dbh->query( $sql );
  if ($result) { // Check if result not empty, that userid exists
    $result_array = $result->fetch(PDO::FETCH_ASSOC);
    if ($result_array['PASSWORDHASH'] == $passwordhash) {
       // login success
       $success = true;

       // do all the login stuff here...
       // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. 

    } // else fail, wrong password
  } // else fail, no such user
} else {
  // fail, userid or password missing
  echo ' please enter user id and password.';
}
if (!$success) {
  echo ' login failed.';
}

Tabii ki, kod biraz temizlenmiş olabilir, ama bu yapılması gerekenleri açıklamak gerekir. Şifre hem karma çünkü unutmayın, ve never used in the SQL, aslında temizlik ihtiyacı yoktur. Orijinal kodu o was sorguda kullanılan beri Ama ben, sadece durumda orada bıraktı.

Depolama şifreleri ilgili tüm kod yerine parola hash saklamak için değiştirilmesi gerektiğini unutmayın. Ayrıca, karma önce salt şifre eklenen kullanmak için çok iyi bir fikir olacaktır.

Ayrıca, ben sadece eğitim amaçlı kod sağlanan - Ben sadece kod bunu nasıl açıklamak için açık bir yol olduğunu düşündüm. Yani kod istemek için bir hizmet olarak bu siteyi hata yok. :)

php manual PHP öğrenmek için mükemmel bir kaynaktır. Biraz SQL bilmek gibi görünüyor, ve iyi bir başlangıç ​​PDO, duymuş. Eğer "PDO" için google arama, ya da dönem için PHP kılavuzda bakarsanız, PDO section kılavuzun bulacaksınız. Eğer ->query fonksiyonunu bulduk gibi şimdi o döner görmek gerekir görünüyor. Bu işlev için gidiş manual page, biz bir PDOStatement nesnesi döndüren görüyoruz. Kelime PDOStatement yardımsever o nesne üzerinde mevcut yöntemleri listelenir kılavuzunda, ilgili sayfasına bağlıdır. Muhtemelen ne istediğinizi yapacak bir rowCount() yöntem yoktur.