[英]Why I am getting access to the admin panel without sending username and password by using php cURL
[英]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多年來一直被認為不足且不安全,無法進行密碼散列,並且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.