2013-07-07 132 views
-1

我試圖讓登錄控制,但它總是說「成功登錄」,但用戶名和密碼不正確。它不檢查用戶名和密碼在登錄時

  $usename=trim($_POST["username"]); 
      $password=$_POST["password"]; 
      $check=mysql_query("SELECT * FROM tablename where username='".$username."' and password='".$password."'"); 
      if($check){ 
        $list=mysql_fetch_array($check); 
        echo "successfully logged in"; 
        session_start(); 
        $_SESSION['member']=$check['id']; 
      }else{ 
        echo "wrong password or username"; 
       } 
+3

您正在使用[**的**過時的數據庫API(http://stackoverflow.com/ q/12859942/19068),並應使用[現代替代](http://php.net/manual/en/mysqlinfo.api.choosing.php)。你也**易受[SQL注入攻擊](http://bobby-tables.com/)**,現代的API會使[防禦]更容易(http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)自己從。 – Quentin

+0

歡迎來到sqlinjection的世界...... –

+3

最後,**不要以純文本**存儲密碼。 – SLaks

回答

1

if($check)只是告訴你的查詢執行successfully.To檢查登錄是否成功,修改代碼如下。

$usename=trim($_POST["username"]); 
       $password=$_POST["password"]; 
       $check=mysql_query("SELECT * FROM tablename where username='".$username."' and password='".$password."'"); 
       if($check){ 
       $row_count=mysql_num_rows($check); 
       if($row_count==1) 
         { 
         echo "successfully logged in"; 
         session_start(); 
         $_SESSION['member']=mysql_result($check,0,'id'); 
         } 
       else 
         echo 'Invalid username/password'; 
       }else{ 
         echo mysql_error(); 
        } 

[注:請不要使用mysql_功能,因爲它們已被取消,造成一些安全威脅]

+0

告訴我,如果發生任何錯誤,我會盡快糾正它。 –

+0

它的工作感謝您的幫助:) –

-1

首先,讓我開始與此:

歡迎堆棧溢出! Please, don't use mysql_* functions in new code。他們不再維護and are officially deprecated。請參閱red box?請改爲了解prepared statements,並使用PDOMySQLi - this article將幫助您決定哪個。如果您選擇PDO,here is a good tutorial

其次,你的$check變量總是會在查詢成功的情況下(即使它沒有任何結果)true

你需要檢查的是,如果$listempty()或沒有。

0

如果查詢成功,(不建議使用)mysql_query函數(您不應該使用它)返回資源。成功被定義爲「沒有錯誤」而不是「至少有一個結果」。

你需要採取資源並確定其內容表明,沒有發現匹配(例如by counting,看是否至少有一行被發現。)

3

mysql_query結果不表明是否有任何結果。 mysql_queryas per the official documentation,返回false如果查詢失敗,例如由於錯誤(如語法錯誤)的。您的查詢是正確的,因此mysql_query不會返回false。不返回任何結果的查詢也被認爲是正確的。

您需要使用mysql_num_rows($check) > 0more info here),看看是否能用戶存在。

其次,你不應該存儲明文密碼,因爲這是一個巨大的安全漏洞。 Don't just take my word for it, here's a detailed explanation why that is a bad thing!。基本上,如果惡意用戶(通過安全漏洞)獲取數據庫中的所有記錄,他將能夠通過以他身份登錄來模擬他想要的任何用途。如果你的密碼存儲在數據庫中,他將無法做到這一點。此外,很多人只是重複使用相同的用戶名/密碼組合來訪問所有(或大部分)網站。如果黑客獲得用戶的非散列密碼,有一個巨大的機會,不僅是他們的網站上的身份遭到盜用,而且在其他網站上的一個巨大的數字 - 也許Facebook,微博等*。

第三,您正在讓您的網站非常容易獲得入侵。確保你過濾你的數據,以便you prevent SQL injection

儘管這可能只是一個個人項目,該項目將不會發布,它仍然是非常重要的,以確保你做正確的事情,因爲Web應用程序的安全性有很大的理解是至關重要的任何有抱負的Web開發人員。


而且作爲最後一點,mysql_*功能在當前marked as deprecated並將很快被刪除,因爲它被認爲是他們鼓勵不好的做法。無論如何,如果您從頭開始編寫應用程序,建議使用mysqli_* family of functions,因爲它們經常保持並提供更大的靈活性。


*是的,最現代的站點有額外的安全機制,但並不是所有的用戶都啓用它們

+0

完美的答案我沒有時間給。 +3從我。儘管我會添加關於'mysql_ *'過時的問題。如果你願意,我可以給你發送模板。 –

+0

嘿,謝謝!^_ ^雖然整個棄用的事情是一個複雜的問題(我昨天剛剛與另一個SO用戶進行激烈的爭論)。無論如何,我會提及棄權。 –

+0

謝謝你的幫助。我每天都會學到新東西:) –