用于检查密码 strlen 的函数在 php 中不起作用

function for checking strlen of a password doesn't work in php

我正在制作一个注册页面,一切正常并已发送到数据库,但您可以输入弱密码。我想确保 pwd 长度的最小长度为 8。我添加了这些代码行,但是当我测试它时它跳过了这段代码,你可以输入任何你想要的 pwd。有谁知道为什么跳过这一行以及这个问题的解决方案是什么?

function pwdTooShort($pwd) {
    $result;

    if (strlen($pwd) > 7) {
        $result = true;
    }
    else{
        $result = false;
    }
    return $result;
}

if (isset($_POST["submit"])) {
    $pwd = $_POST["pwd"];
    require_once 'functions.inc.php';

    if(pwdTooShort($pwd) !== false)  {
        header("location: ../sign-in.php?error=passwordtooshort");
        exit();
    }
}

if (isset($_GET["error"])){
    if($_GET["error"] == "passwordtooshort"){
        echo "<p> password is too short </p>";
    }
}

<form action="include/signup.inc.php" method = "post">
    <input type="password" name = "pwd" />
</form>

你的逻辑有点问题。

如果密码超过 7 个字符(向后),您的 pwdTooShort() 现在将 return true。您可以将该函数更改为:

function pwdTooShort($pwd)
{
    // Return true if it is 7 characters or shorter
    return mb_strlen($pwd) <= 7;
}

我还将 strlen() 更改为 mb_strlen() 以说明多字节字符,正如@vee 在评论中所建议的那样。

改进建议

if-陈述在技术上是正确的,但“过于复杂”。

你可以改变

if (pwdTooShort($pwd) !== false)

要么

if (pwdTooShort($pwd) === true)

或者只是

if (pwdTooShort($pwd))

为了更容易阅读

根据你的函数名来检查密码是否太短,我认为如果太短则应该 return true 否则应该 false
这是代码。它只是翻转 truefalse.

/**
 * Check if password is too short (less than 8 characters).
 *
 * @param string $pwd The raw password without hash.
 * @return bool Return `true` if it is too short, return `false` if it is not.
 */
function pwdTooShort($pwd) {
    $result;

    if (mb_strlen($pwd) > 7) {
        $result = false;
    }
    else{
        $result = true;
    }
    return $result;
}

上面的代码,我把strlen()改成了mb_strlen(),让它支持多字节字符(unicode文本),并精确计算字符。
我建议您不要将字符限制为非 unicode。 OWASP.

推荐

Allow usage of all characters including unicode and whitespace. There should be no password composition rules limiting the type of characters permitted.

他们所说的空格是字符之间的意思。你仍然可以 trim($password).

代码的其余部分将适用于此。