2013-07-31 103 views
0

我在測試項目上工作,試圖瞭解更多關於PHP和MySQL什麼沒有得到NULL結果。所以我決定爲我的測試網站構建一個認證引擎,但是我遇到了這個問題。PHP/MySQL的驗證腳本查詢

基本上,如果我跑......

SELECT * FROM users WHERE name="tester" and passwd=md5('pass'); 

從mysql控制檯,我得到...

+--------+---------------+----------------------------------+ 
| name | email   | passwd       | 
+--------+---------------+----------------------------------+ 
| tester | [email protected] | 1a1dc91c907325c69271ddf0c944bc72 | 
+--------+---------------+----------------------------------+ 
1 row in set (0.00 sec) 

然而,當我發出相同的查詢(至少我認爲它從我的PHP代碼相同)(見下文),我似乎得到一個空的結果,從而驗證失敗。

<?php 
    include 'db_connect.php'; 

    $username = $_POST['username']; 
    $passwd = $_POST['passwd']; 

    // To protect MySQL injection (more detail about MySQL injection) 
    //$username = stripslashes($username); 
    //$passwd = stripslashes($passwd); 
    //$username = mysql_real_escape_string($username); 
    //$passwd = mysql_real_escape_string($passwd); 

    //Encrypted password 
    $secpasswd = md5($passwd); 

    $sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd"; 

    $result=mysql_query($dbconnect,$sql); 
    var_dump($result); 

    // Mysql_num_row is counting table row 
    $count=mysql_num_rows($result); 
    //var_dump($count); 

    // If result matched $myusername and $mypassword, table row must be 1 row 
    if($count==1){ 

     // Register $myusername, $mypassword and redirect to file "login_success.php" 
     session_register("username"); 
     session_register("passwd"); 
     header("location:login_success.php"); 
     } 
    else { 
     echo "Wrong Username or Password"; 
     } 
    ob_end_flush(); 
?> 
+1

從什麼古代手稿你收到'session_register'的事情? –

+1

加密單引號passwd - '和passwd ='$ secpasswd'「'注意這是使用過時的代碼,並且不安全/開放給SQL注入 – Sean

+1

**不要使用md5 **來散列密碼!太不安全 **不使用mysql擴展**。它已被棄用,使用'mysqli'或'PDO'。 –

回答

1

您的查詢是不等價的:

SELECT ... passwd=md5('pass') 

一樣

SELECT ... passwd=password_hash_here 

在第一種情況下,MySQL KNOWS你得到一個字符串從md5電話回來。在第二種情況下,你只是隨便找裸串入的查詢,其中MySQL是被迫當作一個字段名(如果它以字母字符開頭),或無效的號碼(如果以數字開頭)。

嘗試

SELECT ...passwd='$password_hash' 

代替。

0

肖恩在上面的評論中指出,你需要用你的$ secpasswd在單引號。所以

$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd"; 

成爲

$sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd';"; 

但我回答的主要原因是讓你知道你正在使用已被棄用MySQL的方法。你應該看看使用mysqli或PDO。

3

有有s很多與您的代碼的問題。

  • 你的SQL查詢格式錯誤
  • 你實際上並沒有從查詢結果中獲取的任何值
  • 你的散列是
  • 沒有使用預處理語句弱
  • 您使用過時的會話功能

這裏是如何必須

<?php 
include 'db_connect.php'; 

//Encrypted password 
$secpasswd = sha512($_POST['passwd'].$_POST['username']); 

$sql = "SELECT * FROM users WHERE name = ? and passwd = ?"; 
$stm = $pdo->prepare($sql); 
$stm->execute(array($_POST['username'], $secpasswd)); 
$row = $stm->fetch(); 

if($row){ 
    $_SESSION["username"] = $row[username]; 
    header("location:login_success.php"); 
    exit; 
} else { 
    echo "Wrong Username or Password"; 
} 

注意:此代碼使用PDO數據庫交互

0

馬上蝙蝠我注意到,您的密碼字符串沒有用引號括起來。嘗試改變這一點:

$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd"; 

這個

$sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd'";