2013-09-26 46 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和网页设计的新手,我发现它有点难以遵循,但我相信它对你们中的一些人来说似乎是一块蛋糕......