【问题标题】:Secure validation technique on password inputs密码输入的安全验证技术
【发布时间】:2018-03-27 21:21:12
【问题描述】:

那么在验证密码输入时使用$code 更好还是我只需要使用$_POST['code']

在安全性方面究竟应该在什么时候使用secure_input 函数?

有没有更好的方法来执行以下密码验证?

更多关于php表单安全here

PhpFiddle

<?php
    function secure_input($data) {
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
    }
        $code = secure_input($_POST['code']);

        if($code == "ok") echo 'success';
    ?>
     <form method="post" action="">  
     Name: <input type="text" name="code">
    <input type="submit">
    </form>

【问题讨论】:

  • 定义“安全”以及它的用途。
  • 根据类型和“输入”的使用,secure_input 函数可能会破坏它
  • 您建议对密码执行此操作的事实尖叫“我使用的是纯文本密码,也没有使用准备好的语句”。 php.net/manual/en/function.password-hash.php, php.net/manual/en/pdo.prepare.php, php.net/manual/en/mysqli.prepare.php
  • 没有密码验证。除非你想确保它必须包含一个特定的角色,在我自己看来这是错误的,因为你正在为攻击创造一个重生点
  • 您可以获取密码的哈希值,并比较哈希值。请参阅 password_hash 和 password_verify。

标签: php forms security post htmlspecialchars


【解决方案1】:

在安全性方面究竟应该在什么时候使用secure_input函数?

从来没有。这太可怕了。

$data = stripslashes($data);——不要这样做。处理magic quotes 问题是一种技巧。在 2018 年,您不应该使用甚至支持魔术引号的 PHP 版本。

$data = htmlspecialchars($data); — 这使得将文本字符串插入 HTML 文档是安全的。您没有将值输出到 HTML 文档中,所以不要在这里这样做。

有没有更好的方法来执行以下密码验证?

您不应以纯文本形式存储密码。它应该被散列,然后是用户输入(这应该是没有任何转义的原始用户输入,因为您正在比较 password 而不是 html 密码的表示)应该使用password_verify 函数与它进行比较。

PHP 有a FAQ about how to handle passwords

<?php

    $submitted_password = $_POST['code'];
    $submitted_password = "ok"; # Because this demo doesn't get any POST data

    if (password_verify($submitted_password, "$2y$10$76xEMDyKtZEo036w2mQ/zemy3VUDXFhOHRvrljK1F9/6a7rVqlsdi")) {
        print "Good password";
    } else {
        print "Bad password";
    }

?>

【讨论】:

  • 这是什么? $2y$10$76xEMDyKtZEo036w2mQ/zemy3VUDXFhOHRvrljK1F9/6a7rVqlsdi 是随机密码吗?它不应该由 PHP 生成?
  • @GragasIncoming — 这是您之前使用的密码,使用 password_hash 进行哈希处理,如答案中链接到的文档中所述。
  • 我可以设置一个自动散列密码的变量吗?在我的表单示例中使用if (isset($_POST['code'])) {$submitted_password = $_POST['code'];} 不是更好吗?
  • password_hash("ok", PASSWORD_DEFAULT)
  • @csandreas1 — 不要那样做。创建密码时对密码进行哈希处理。存储散列密码。将其存储为纯文本并在每次脚本运行时重新散列它是完全没有意义的。
【解决方案2】:

如上所述,您无需为了比较目的而转义密码输入。

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    $authorised = 'secret' == ($_POST['password'] ?? null);
    echo $authorised ? 'Credential match.' : 'Credential mismatch.';
}

?>
<form method="post">
    Password:<input type="password" name="password">
    <input type="submit" value="Authorise me">
</form>

存储密码的哈希值可能更明智。

何时应该使用secure_input函数 安全吗?

见:https://stackoverflow.com/a/4224002/3392762

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多