我无法使用密码和电子邮件访问我的管理面板。这与PHP和SQL有关
它说指定的电子邮件地址或密码不正确。我使用此代码在数据库中插入密码我无法使用密码和电子邮件访问我的管理面板。这与PHP和SQL有关,php,mysql,sql,Php,Mysql,Sql,它说指定的电子邮件地址或密码不正确。我使用此代码在数据库中插入密码 UPDATE author SET password = MD5('pass') WHERE id = 1 我使用的是PHP5.4.3。 一切都很好,但为什么不起作用呢?请帮忙 这是我的代码: <?php function userIsLoggedIn() { if (isset($_POST['action']) and $_POST['action'] == 'login') { if (!isset($
UPDATE author SET password = MD5('pass') WHERE id = 1
我使用的是PHP5.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代码中验证输入密码时,您将附加一个salt字符串'ijdb'
:
// This appends a salt 'idjb' to the input password before hashing
$password = md5($_POST['password'] . 'ijdb');
要在现有状态下更正此问题,您需要将相同的salt添加到数据库中以重新设置密码。单独执行此操作不需要修改现有的PHP代码(其中,$the_password
是您正在存储和测试的管理员密码):
改进哈希,而不是坚持使用MD5:
正如在上面的评论中提到的,MD5多年来一直被认为对于密码散列来说是不充分和不安全的,4个字符的salt太短,不太有效。从PHP5.5开始,通过为5.3+开发的一个应用程序,PHP支持bcrypt,从而大大改进了密码散列
请复习关于如何开始的优秀答案
此外,PHP社区的勇敢和技术娴熟的成员以正确的方式聚集了PHP,这具有重要意义。总的来说,该网站非常优秀,我建议您在学习PHP的过程中对其进行检查。现在就停止使用这本书,它的最新版本很危险,还有任何错误吗?您正在使用并且需要更改您用户的密码。看起来您的PHP代码添加了salt$password=md5($_POST['password'.'ijdb')
但是当你在数据库中散列密码时,它没有salt:更新author SET password=MD5('pass'),其中id=1
(salt是'idjb'
)老实说,我从来没有读过一本php\mysql的书,它们在出版之前已经过时了。interweb有一两个教程(百万)
UPDATE author SET password = MD5(CONCAT($the_password, 'ijdb'))