【问题标题】:Change password searching for ID with sha1 hash in mysql query在mysql查询中使用sha1哈希更改密码搜索ID
【发布时间】:2016-03-31 23:40:54
【问题描述】:

我正在尝试使用 PHP PDO 中的以下代码更改用户的密码:

public function resetaSenha(string $senha, string $id){
            $con = $this->conexao;

            $sql = "UPDATE users SET senha = :senha WHERE id = sha1(:id)";

            $obj = $con->prepare($sql);
            $obj->bindParam(":senha", $senha);
            $obj->bindParam(":id", $id);
            $obj->execute();
        }

我用 id 1 的 sha1 哈希和密码调用这个函数(我这样做只是为了测试):

    require_once("funcoes_db.php");

    $func = new FuncoesDb();
    $func->resetaSenha("05fe7461c607c33229772d402505601016a7d0ea", "356a192b7913b04c54574d18c28d46e6395428ab");

但它不起作用。如果我将查询更改为:

$sql = "UPDATE users SET senha = :senha WHERE id =:id";

然后调用函数:

    `$func->resetaSenha("05fe7461c607c33229772d402505601016a7d0ea", "1")`;

但我通过 URL 获取值,我需要对它们进行加密。为什么不这样工作?

【问题讨论】:

  • 看起来没问题...一切都在你的 sql server 中工作了吗?
  • 是的,它可以在 PHP 中没有 sha1() 的情况下工作。
  • 警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并确保您对密码使用正确的加密哈希。

标签: php mysql pdo sha1


【解决方案1】:

我认为您在没有意识到的情况下打错了字。查询字符串在:id 上调用sha1 函数,而此时它应该在:senha 上调用以散列密码。

$sql = "UPDATE users SET senha = :senha WHERE id = sha1(:id)";

应该是

$sql = "UPDATE users SET senha = sha1(:senha) WHERE id = :id";

【讨论】:

    【解决方案2】:

    您的 id 列是 varchar 类型?如果不是,如果它是 int 自动增量,则不应在 where 子句中使用 WHERE id = sha1(:id)。

    如果您想在 URL 中加密用户 ID,请尝试使用可以编码和解码的 base64。 Sha1 是哈希函数,无法解码。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2011-04-30
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多