0

您好我正在尝试制作一个检索密码脚本,我在数据库中的密码是编码的,这里是检索它的脚本:

<?php 
$salt = "Zo4rU5Z1YyKJAASY0PT6EUg7BBYdlEhPaNLuxAwU8lqu1ElzHv0Ri7EM6irpx5w";
include_once("config.php"); //include the settings/configuration
$password = null;

/* function svarzcane kam bazata */

$email = $_POST['email'];



try {

          $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); //our new PDO Object
          $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
       }  catch (PDOException $e) {
          echo $e->getMessage(); //catch and show the error
       }  

          $stmt = $con->prepare("SELECT password FROM users WHERE email = :getmail LIMIT 1");
          $stmt->bindParam(":getmail", $_POST['email']);    
          $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );

          $stmt->setFetchMode(PDO::FETCH_ASSOC);      
          $stmt->execute(); 

while( $row = $stmt->fetch()) {  
$pass = $row['password']; 
}

这里的问题是,当我尝试解码密码时,它给了我一个错误:Fatal error: Using $this when not in object context in /home/cedecapr/public_html/retrive.php on line 18

我该如何解决?任何帮助将不胜感激。谢谢。

解码变量在类文件中定义:public $salt = "decoding code";

正如 Barmer 所建议的,我不能在课程代码之外使用它。而不是如何使用哈希算法绑定值。

如何更改此行

$stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );

从数据库中解码结果。哈希算法也在代码顶部更新。

4

2 回答 2

1

您可以完全删除此行:

$stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );

您的 SQL 语句不包含名为 的参数:password,因此无需将任何值绑定到它。我猜你确实从某个类方法中复制并粘贴了这行代码,这$this是有意义的。

我还想知道如果您确实检索密码是否会有所不同,因为数据库似乎存储了加盐密码的 SHA256 哈希。散列是不可逆的,因此即使您确实password从数据库中检索了列的内容,用户也无法使用它来登录。

我认为在对任何网站的身份验证系统进行任何更改之前,您需要了解更多关于 PHP 编码和安全性的知识。

于 2013-10-26T00:32:26.647 回答
0

这一行:

$stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );

应该:

$stmt->bindValue( "password", hash("sha256", $password . $salt), PDO::PARAM_STR );

您不能$this->在类定义之外使用。时期。\n. EOF.

于 2013-10-26T00:32:19.707 回答