0

我对安全性不是很熟悉,因此我依赖于我在互联网上找到的内容。我找到了一个网站,有人解释了他的工作以及他的方法是如何工作的。人们可能会复制粘贴它以缓解问题。尽管我确实了解很多,但我自己无法想出(我对 PHP/XHTML 等很陌生)

网站:如何使用 PHP 和 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['name'] = $username。到现在为止,我只是简单地回应它是否成功。而且它没有显示任何东西,所以它不起作用。

第二次编辑

作为一个快速更新,我提供的脚本是整个脚本。什么都放不出来。(数据库名称等除外)因此我想知道问题是否可能是我没有使用将密码保存到数据库中的哈希脚本。虽然我把它放进去,它仍然没有反应。我还在做错什么吗?

4

4 回答 4

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;
于 2013-09-26T18:11:17.253 回答
0

我知道这个帖子已经有几个月了,但有人可能会找到这个 SunnyTuts php pdo login and registration tutorial

教程很有帮助。在寻找允许用户登录的安全方式时,我发现了这个线程和教程。作为 php 和网页设计的新手,我发现它有点难以理解,但我相信对你们中的一些人来说这似乎是小菜一碟......

于 2014-01-01T13:47:56.943 回答
0

也许您必须检查将密码存储在数据库中的字段的长度...如果长度很小,则散列密码将不会完整存储..您将存储其中的一部分!

于 2013-09-26T18:02:15.583 回答
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"; }
于 2013-09-26T19:26:45.370 回答