Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我无法使用密码和电子邮件访问我的管理面板。这与PHP和SQL有关_Php_Mysql_Sql - Fatal编程技术网

我无法使用密码和电子邮件访问我的管理面板。这与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'))