2012-06-10 104 views
0

我做了一個完美的登錄腳本,除了即使用戶名和密碼不正確時也能登錄的事實。PHP腳本甚至在登錄不正確時登錄

下面是代碼:

<?php 
//SQL ENTRY 
$username_db = "root"; 
$password_db = ""; 
$host = "127.0.0.1"; 
$db = "teach_login"; 

//Requested 
$usern = $_POST['username']; 
$pw = $_POST['password']; 

//Make it safe 
$usern = htmlspecialchars($usern); 
$pw = htmlspecialchars($pw); 
$pwmd5 = md5($pw); 

//SQL SETTINGS 
$db_handle = mysql_connect($host, $username_db, $password_db); 
$db_open = mysql_select_db($db, $db_handle); 
echo $db_open."<br />"; 
if ($db_open){ 
    $SQL = "SELECT `username` FROM userpassword WHERE (username = '$usern' && password = '$pwmd5') "; 
    $result = mysql_query($SQL); 
    echo $result."<br />";; 
    if ($result >= 1){ 
     $SQL_name = "SELECT * FROM `userpassword` WHERE (username = '$usern') "; 
     $result_new = mysql_query($SQL_name); 
     while($row = mysql_fetch_assoc($result_new)){ 
      $name = $row['full_name']; 
      echo $name; 
      echo "<br />"; 
      echo $row['password']."<br>"; 
      $SQL = "UPDATE `userpassword` SET `logged_in`=[1] WHERE `username` = '$usern' "; 
      $result = mysql_query($SQL); 
      if ($result > 0){ 
       mysql_close($db_handle); 
      }else{ 
       echo "Data Not written"; 
      } 
     } 
     /*echo $result_new."<br />";    
     echo $result_name_array."<br />"; 
     $name = $result_name_array[1]; 
     echo $name."<br />"; 
     session_start(); 
     $_SESSION['login_name'] = $name; 
     $_SESSION['login'] = 1; 
     mysql_close($db_handle); 
     //header ("location: teach_home.php"); 
     */ 
    }else{ 

     echo "Cannot Login"; 
     //header ("location: teach_login.php"); 
     mysql_close($db_handle); 
    } 

}else { 
    echo ('DATABASE NOT FOUND'); 
    mysql_close($db_handle); 
} 
?> 

輸出是這也就是SQL入門:

1<br> 
Resource id #4<br> 
Salik Sadruddin<br> 
14918756cc99b9e6ce69f4c943680efc<br> 
Data Not written<br> 
+0

該腳本和您正在採取的方法存在很多錯誤,特別是從良好安全性的角度來看。我建議你使用預先編寫的庫來處理認證 - 有一些[這裏列出的好](http://stackoverflow.com/questions/414034/actively-maintained-php-libraries-for-user-authentication ) –

+1

***爲了更新,如果UPDATE語句成功,$ result會給你0.對於插入它會給你1 *** –

+0

謝謝,但你可以告訴我我錯了,以備將來使用。 –

回答

0

對於更新,如果UPDATE語句成功$結果會給你0。對於插入它會給你1

$SQL = "UPDATE `userpassword` SET `logged_in`=[1] WHERE `username` = '$usern' "; 
     $result = mysql_query($SQL); 
     if ($result == 0){ 
      echo "Data Updated"; 
      mysql_close($db_handle); 
     }else{ 
      echo "Data Not written"; 
     } 
+0

是的,它的作品謝謝:D bt登錄問題仍然相同 –

+0

@ ZackValentine:什麼登錄問題?我沒有找到你...... –

+0

即使用戶pw不正確,第四個腳本也會記錄我 –

1

這就是缺陷是:

$result = mysql_query($SQL); 
if ($result >= 1){ 
    // … 
} 

mysql_query返回值是沒有選擇的行的數量,但:

對於SELECT,SHOW,描述,解釋和其它語句返回結果集, mysql_query()成功返回資源,錯誤時返回FALSE。

在你的情況下,查詢可能會成功,但選擇沒有記錄,但是mysql_query將返回一個資源,將滿足表達$result >= 1

爲了解決這個問題,使用mysql_num_rows獲得選定的行數:

if ($result && mysql_num_rows($result) === 1){ 
    // … 
} 

還要考慮使用MySQLiPDO_MYSQL而不是標準的MySQL擴展的。你也應該閱讀關於SQL injections,因爲你目前的代碼是脆弱的。