密码输入的安全验证技术

Secure validation technique on password inputs

那么在验证密码输入时使用 $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>

如上文所述,您无需出于比较目的对密码输入进行转义。

<?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>

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

When exactly should the secure_input function be used when it comes to security?

参见:

When exactly should the secure_input function be used when it comes to security?

从来没有。这太可怕了。

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

$data = htmlspecialchars($data); — 这样可以安全地将文本字符串插入到 HTML 文档中。您没有将值输出到 HTML 文档中,所以不要在此处执行此操作。

Is there a better way to perform the below password validation?

您不应以明文形式存储密码。它应该被散列,然后是用户输入(这应该是原始用户输入,没有任何转义,因为你正在比较 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, "yxEMDyKtZEo036w2mQ/zemy3VUDXFhOHRvrljK1F9/6a7rVqlsdi")) {
        print "Good password";
    } else {
        print "Bad password";
    }

?>