2013-09-26 45 views
0

我對安全性不是很熟悉,所以我依靠我在互聯網上找到的東西。我找到了一個解釋他所做事情的人以及他的方法如何工作的網站。人們可以複製粘貼它來緩解事情。 雖然我明白了很多,我不能拿出它自己(我很新的PHP/XHTML等)PHP PDO登錄腳本不起作用。包含錯誤

網站:How to store safely with PHP and MySQL

他使用PDO在他的教程。我能夠將信息存儲在數據庫中。但是當我嘗試使用他提供的代碼實際登錄的腳本時,雖然它看起來包含錯誤。

我已經做好了一切,一切正常,但哈希密碼與插入的密碼(散列等)的比較無法正常工作。

這到底是怎麼回事?

在此先感謝!

編輯

人們一直在問的代碼,所以,在這裏它是:

session_start(); 
    require('config.php'); 

    // Setting up a connection 
    $MyConnection = new PDO('mysql:host=*;dbname=*', $dbuser, $pass); 

    // Retrieving information from form. 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $sth = $MyConnection->prepare("SELECT * FROM AMP_Users WHERE Username = :username LIMIT 1"); 
    $sth->bindParam(':username', $username); 
    $sth->execute(); 

    $user = $sth->fetch(PDO::FETCH_OBJ); 

    // Hashing the password with its hash as the salt returns the same hash 
    if (crypt($password, $user->hash) == $user->hash) { 
    echo 'You are now logged in. If we actually used sessions this time.'; 
    } 

我會加$ _SESSION [ '名'] = $用戶名,一旦代碼開始上班。直到現在,我只是迴應,如果它成功或沒有。它沒有顯示任何內容,所以它不起作用。

第二個編輯

就像一個快速更新,由我提供的腳本,是整個腳本。沒有什麼是泄漏的。 (除了數據庫的名稱等) 因此我想知道這個問題是否可能是因爲我沒有使用將密碼保存到數據庫中的散列腳本。雖然我已經投入了,但它仍然沒有迴應。我仍然做錯了什麼?

+0

向我們展示您的代碼,我們可以修復它您。 – Aristona

+0

哪裏是代碼? –

+0

這是在網站鏈接上提供的代碼..它是完全一樣的。而不是SELECT哈希我使用SELECT * 但是好的,我會提供代碼。 –

回答

0
if($_POST): 

    $name = $_POST['username']; 
    $pass = crypt($_POST['password'], '$2a$07$Hd893nD39Jdjd48Jdh3nD$'); 

    $conn = new PDO('mysql:host=*; dbname=*', 'root', ''); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  

    $stmt = $conn->prepare('SELECT * FROM user WHERE name = ? AND password = ?'); 
    $stmt->execute(array($name, $pass)); 

    if($stmt->rowCount() === 0){ 
     echo 'Your Username/Password is incorrect. Please try again'; 
    }else{ 
     echo 'login success'; 
    } 

    endif; 
+1

增加的解釋將對所有人,特別是OP有利;-) –

+0

@ Fred-ii-你是對的:)但是,我認爲答案本身是自我誇張的 – samayo

+0

$ sth,代表Statement Handle 就像$ dbh將代表數據庫句柄。 此外,我只是從我的主要信息中提供的網站粘貼複製腳本。我最明白,如果不是全部的話。仍然有一些錯誤。我完全找不到它們。 –

0

也許你必須檢查你在數據庫中存儲密碼的字段的長度......如果長度很小,那麼哈希密碼將不會作爲整體存儲..你將存儲它的一部分!

+0

我使用簡單的文本。不是一個varchar,它會限制我可以存儲的字符數量。 數據庫設置正常。該錯誤必須在代碼中。 –

0

我修改了它的運行mysqli的,它工作得很好:

  $getAuth=$dbConAU->prepare("SELECT Password FROM Users WHERE UserName=? LIMIT 1"); 

      $getAuth->bind_param("s",$UserName); 
      $getAuth->execute(); 
      $getAuth->bind_result($hash); 
      $getAuth->fetch(); 
      $getAuth->close(); 

      if (crypt($Password, $hash) == $hash) { 
       return "OK"; 
       } 
       else { return "Not OK"; } 
+0

嗯..這個工程好一點。bind_param不存在,所以我只使用bindParam(':username',$ username)。 –

+0

bind_param是一個mysqli方法,而不是pdo – Snowburnt

+0

我明白了。這就是爲什麼我使用bindParam(); 雖然我仍然無法獲得bind_result()的工作。由於我的腳本以某種方式將其視爲PDO聲明。 –

0

我知道這個線程是一個幾個月大,但有人可能會發現這個 SunnyTuts php pdo login and registration tutorial

教程很有幫助。我找到了這個線程和教程,同時尋找一種安全的方式來允許用戶登錄。作爲PHP和網頁設計的新手,我發現它有點難以遵循,但我相信它對你們中的一些人來說似乎是一塊蛋糕......