php oturum açma komut dosyası - Beni hatırladın

3 Cevap php

Herkes bu oturum açma komut ile yanlış bir şey görebilirsiniz:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  } else {
    echo $username, $pass;
  }

Açıklamak gerekirse:

At the moment the script is allowing anything through. In other words the query is returning true for any username and password that are passed to it. I've put the echo statement just as a check - obviously the script would continue in normal circumstances!

I know that the connect class and login_connect method are working because I use them in a register script that is working fine. depException is just an extension of the Exception class.
The function login() is part of the same class that contains register() that is working fine.
I know that the two variables ($username and $pass) are getting to the function because the echo statement is outputting them accurately. (The $remember variable is not needed for this part of the script. It is used later for a remember me process).
I'm stumped. Please help!

UPDATE

Bu yanıt için teşekkürler. Ben sorgu dönen ne ile karışık alıyorum. Tam komut iade kaç satır kontrol yapar ve kontrol yapılmalıydı bu nerede. Şimdi herşey benim, beni hatırlar fonksiyonu için DIŞINDA çalışıyor. Belki birisi bu konuda yardımcı olabilir?!?! İşte tam betik:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  }       
  if ($result->num_rows>0) {
    $row = $result->fetch_assoc();
    //assign id to session
    $_SESSION['user_id'] = $row[user_id];        
    // assign username as a session variable
    $_SESSION['username'] = $username;        
    // start rememberMe
    $cookie_name = 'db_auth';
    $cookie_time = (3600 * 24 * 30);*/ // 30 days
    // check to see if user checked box
    if ($remember) {
      setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
    }
    // If all goes well redirect user to their homepage.
    header('Location: http://localhost/v6/home/index.php');   
  } else {
    throw new depException('Could not log you in.);
  }
}

Yardımlarınız için çok teşekkür ederiz.

GÜNCELLEME 2!

Thanks to your help I've got the main part of this script working. However, the remember me bit at the end still doesn't want to work. Could someone give me a hand to sort it out? $username, $pass and $remember are all short variable names that I assigned before passing them to the function to save writing $_POST['username'] etc. everytime. $remember refers to a checkbox.

3 Cevap

Bir sözdizimi vardır gibi sorgu tamamen $conn->query() dönüşünü, mysql_query() does? If so then it'll always compare "true". mysql_query() sadece getiri FALSE gibi bir MySQL kaynak nesne başarısız ederse ne hata veya bir tablo yok.

Eğer mysql_fetch_row() ne olursa olsun sizin eşdeğer aracılığıyla, sonuç kümesinden bir satır getirme çalışın ve bir şey almak olmadığını görmek gerekir herhangi bir sonuç var olmadığını kontrol etmek için.

Important: Sizin komut SQL injection attacks açıktır, ya da benzeri hatta sadece tek Adlarını o'neil, bir kesme işareti ile. Sen mysql_real_escape_string() (veya eşdeğeri) sorgu özel karakterler tarafından berbat almaz emin olmak için bir sorgudaki tüm değişkenleri kaçmak gerekir. Veya daha da iyisi, benziyorsun hazırlanmış ifadelerini kullanan

select * from login where username=? and password=sha1(?)


Re: UPDATE

Bir form değişkenleri yöntemi formu göndermek için kullanılan bağlı olarak hangi, ya $_GET veya $_POST yoluyla ulaşılabilir. Bu onay kutusu işaretli ise if (isset($_POST['remember'])) görmeye çalışın.

Important: Seni onay kutusunun işaretli olup olmadığını görmek için bir çıplak $remember kullanmaya çalıştığını görüyoruz. Yani normal değişken isimleri aracılığıyla GET ve POST değişkenleri erişilebilir kılan PHP register_globals özellikten yararlanmak için çalışıyoruz bana gösteriyor. Bu durumda eğer PHP kılavuzunda uyarısını dikkate almalıdır!

WARNING

[register_globals] PHP 5.3.0 ÖNERİLMEMEKTEDİR ve PHP 6.0.0 'da ÇIKARILDI olmuştur. Bu özelliği dayanarak önerilmez.

Bunun yerine, $_GET ve $_POST kullanın. Ben nasıl if ($remember) iş, aslında, ama doğasında kötü-lık verilen register_globals vermeyeceğim yapmak size söyleyebilirdi! ;-)

Sorgunuz sql-injections açıktır ...

SELECT *
FROM users
WHERE username = '' OR 'a' = 'a'
AND password = sha1('guessAnyPassword')

Ben de senin sonucunu kontrol ve iade kaç kaydın üzerine eylemi temel ediyorum.

if (mysql_num_rows($result) > 0)

Onları yürütülürken bir hata varsa php en sorguları yalnızca False döndürür. Sizin sorgu, değerler muhtemelen bir dizi boş bir değer döndürüyor. Bu kadar beyanı söz konusu olduğunda sanki yanlış bir değer değil.

Döndürülür kaç satır edin. Bunu yapmak için fonksiyonu soyutlama katmanı bağlıdır (sınıf bağlamak vs ..)