簡體   English   中英

我無法使用密碼和電子郵件訪問管理面板。 這與PHP和SQL有關

[英]I am Unable to access my admin panel with my password and email. This is PHP and SQL related

提示指定的電子郵件地址或密碼不正確。 我使用此代碼將密碼插入數據庫

UPDATE author SET password = MD5('pass') WHERE id = 1  

我正在使用PHP 5.4.3。 一切都很好,但是為什么不起作用呢? 請幫忙

這是我的代碼:

 <?php

  function userIsLoggedIn()
{
if (isset($_POST['action']) and $_POST['action'] == 'login')
{
if (!isset($_POST['email']) or $_POST['email'] == '' or
  !isset($_POST['password']) or $_POST['password'] == '')
{
  $GLOBALS['loginError'] = 'Please fill in both fields';
  return FALSE;
}

$password = md5($_POST['password'] . 'ijdb');

if (databaseContainsAuthor($_POST['email'], $password))
{
  session_start();
  $_SESSION['loggedIn'] = TRUE;
  $_SESSION['email'] = $_POST['email'];
  $_SESSION['password'] = $password;
  return TRUE;
}
else
{
  session_start();
  unset($_SESSION['loggedIn']);
  unset($_SESSION['email']);
  unset($_SESSION['password']);
  $GLOBALS['loginError'] =
      'The specified email address or password was incorrect.';
  return FALSE;
  }
}

   if (isset($_POST['action']) and $_POST['action'] == 'logout')
  {
   session_start();
   unset($_SESSION['loggedIn']);
   unset($_SESSION['email']);
   unset($_SESSION['password']);
   header('Location: ' . $_POST['goto']);
   exit();
   }

session_start();
if (isset($_SESSION['loggedIn']))
{
return databaseContainsAuthor($_SESSION['email'], $_SESSION['password']);
}
}

function databaseContainsAuthor($email, $password)
{
include 'db.inc.php';

try
{
$sql = 'SELECT COUNT(*) FROM author
    WHERE email = :email AND password = :password';
$s = $pdo->prepare($sql);
$s->bindValue(':email', $email);
$s->bindValue(':password', $password);
$s->execute();
}
catch (PDOException $e)
{
$error = 'Error searching for author.';
include 'error.html.php';
exit();
}

$row = $s->fetch();

if ($row[0] > 0)
{
return TRUE;
}
else
{
return FALSE;
}
}

function userHasRole($role)
{
 include 'db.inc.php';

 try
 {
  $sql = "SELECT COUNT(*) FROM author
    INNER JOIN authorrole ON author.id = authorid
    INNER JOIN role ON roleid = role.id
    WHERE email = :email AND role.id = :roleId";
  $s = $pdo->prepare($sql);
  $s->bindValue(':email', $_SESSION['email']);
  $s->bindValue(':roleId', $role);
  $s->execute();
 }
catch (PDOException $e)
{
$error = 'Error searching for author roles.';
include 'error.html.php';
exit();
}

$row = $s->fetch();

if ($row[0] > 0)
{
 return TRUE;
}
else
{
 return FALSE;
 }
  }

要使現有代碼正常工作:

如上所示,密碼檢查代碼的主要問題是數據庫中存儲的MD5哈希與PHP代碼中傳遞的用於檢查密碼驗證的MD5哈希之間不匹配。

在表中,您存儲了裸密碼MD5哈希,沒有鹽字符串:

UPDATE author SET password = MD5('pass') WHERE id = 1  

但是,當在PHP代碼中驗證輸入密碼時,您將附加一個鹽字符串'ijdb'

// This appends a salt 'idjb' to the input password before hashing
$password = md5($_POST['password'] . 'ijdb');

要在現有狀態下更正此錯誤,您需要向數據庫中添加相同的鹽值以重新哈希密碼。 單獨執行此操作無需修改現有的PHP代碼(其中$the_password是您要存儲和測試的管理員密碼):

UPDATE author SET password = MD5(CONCAT($the_password, 'ijdb'))

改進哈希而不是堅持使用MD5:

正如上面的評論中提到的,MD5多年來一直被認為不足且不安全,無法進行密碼散列,並且4個字符的鹽太短了以至於無法有效發揮作用。 從PHP 5.5開始,並為5.3+開發了特殊的兼容性庫 ,PHP支持bcrypt,可大大改善密碼哈希。

請查看如何在PHP中使用bcrypt進行密碼哈希,以獲取有關如何開始使用password_hash()password_verify()出色答案

此外,PHP社區的勇敢而又熟練的成員組成了PHP The Right Way ,其中包含有關密碼哈希部分 通常,該網站非常好,建議您在學習PHP的過程中對其進行回顧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM