2012-02-16 123 views
1

我在PHP中編寫了一個函數,用於檢查MySQL數據庫的用戶名和密碼,並在成功驗證後將其存儲爲會話。但是,無論我輸入到輸入框的任何值,它都會批准它併成功登錄。我登錄的代碼不起作用用戶名和密碼驗證在PHP中不起作用?

這裏是

function queryByUserAndPass($tableName, $username, $password){ 
    $queryStatement = "SELECT * FROM ".$tableName." WHERE username='".$username."' 
         AND password='".$password."' LIMIT 1"; 
    return $queryStatement; 
} 

function checkLogIn() { 

    if(isset($_POST['submit'])){ 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $queryState = queryByUserAndPass("nepal_users", $username, $password); 
     if($resultQuery = mysql_query($queryState)){ 
      $found_user= mysql_fetch_array($resultQuery); 
      $_SESSION['id']=$found_user['id']; 
      $_SESSION['username']=$found_user['username']; 
      $message="succesful log in ".$_SESSION['username']; 
      header("location:home.php"); 
      exit; 
     }else { 
      $message="error in log in"; 
     }  

    } 

} 

請告訴我什麼是錯在這段代碼,爲什麼它不工作。

+1

功能queryByUserAndPass($表名,$的用戶名,$密碼){ \t \t $ queryStatement = 「SELECT * FROM」 $表名」其中username =」 「$用戶名。」 ' \t \t \t \t \t \t \t和密碼=' 「$的密碼。」」 LIMIT 1" ; \t \t return $ queryStatement; \t} – monk 2012-02-16 18:32:47

+1

你對用戶密碼有沒有加密?如果你有,你必須使用相同的方法 – mlinuxgada 2012-02-16 18:34:56

+0

你是否使用session_start()初始化了你的會話; – 2012-02-16 18:35:26

回答

0

你不檢查用戶名和密碼是否正確!

if($resultQuery = mysql_query($queryState)){ 
     $found_user = mysql_fetch_array($resultQuery); 
     if ($username === $found_user['username'] && 
      $password === $found_user['password']) { 
      $_SESSION['id']=$found_user['id']; 
      $_SESSION['username']=$found_user['username']; 
      $message="succesful log in ".$_SESSION['username']; 
      header("Location: home.php"); 
      exit; 
     } else { 
      echo "wrong username or password"; 
     } 
    }else { 
     $message="error from database: " . mysql_errno($resultQuery); 
    } 

重要提示

上面剛剛的代碼說明凡在你的代碼邏輯問題。湖中有另外兩個嚴重的問題:

  1. 其易受SQL injection。使用準備好的陳述是常見的做法如果準備好的狀態信息不適用於您,請使用類似$SAFE_USER_DATA = array_map('mysql_real_escape_string', $_POST);的內容,並使用它來代替直接讀取$_POST數據。這樣你可以確保沒有惡意的用戶可以修改你的SQL語句來訪問你的系統。

  2. 您不應該將密碼存儲爲純文本 - 存儲鹽漬鼓勵使用SHA1密碼哈希。不要簡單地使用md5($password)。攻擊者可以很容易地與rainbow tables

+2

假設使用'queryByUserAndPass'函數將用戶名和密碼放入查詢是安全的。 – 2012-02-16 18:35:08

+0

@Kolink你是對的,OP發佈了我的答案後,在評論中的函數。不過,這裏所示的快速修復也應該起作用。儘管有關於SQL注入和缺少密碼哈希的嚴重問題,儘管.. – Kaii 2012-02-16 22:57:53

3

mysql_query幫助解密這些如果在你的代碼中的錯誤總是成功返回的資源,還是假的。

你想要做的是:。

$resultQuery = mysql_query($queryState); 
if($found_user = mysql_fetch_assoc($resultQuery)) { 
    // do login stuff 
    // note I used "fetch_assoc" above, because you don't use numeric indices here. 
} 
else $message = "Error"; 
+0

真正修復的互補+1 – Kaii 2012-02-16 22:58:34