随机字符串生成的字符不在原始字符串中


Random string generated characters not in original string

我使用以下脚本生成临时密码。

我上课之前,我知道这不是加密安全的,我应该使用类似openssl_random_pseudo_bytes的东西。但我的问题不是关于"安全"。

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!£$%^&*()?';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
         $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

我使用连接到gmail SMTP的PHPMailer通过电子邮件将密码发送给用户。我遇到的问题是,当我的老板在另一个国家/地区对此进行演示时,以下字符作为临时 pw 发送:

New Password: Il%KÂUyÂ?F

请注意,重音 A 不在我的可选字符字符串中。这只发生过一次,但根本不应该发生。结果 - 相关的哈希也不匹配,因此临时密码不起作用。我正在使用字段长度为 255 的password_hash($string, PASSWORD_DEFAULT)

当然,当他测试该功能时,他在不同的国家/地区这一事实应该与发送的字符没有任何影响,因为它们是从服务器生成的,显然具有静态位置。

$key = generateRandomString();
$msg.="New Password: ".$key."<br><br>";
$mail->Body = $msg;

我自己尝试过,功能运行良好,所以我认为你的问题是关于编码的。

首先,确保您的字符串是 UTF-8 编码的,使用

utf8_encode($key); 

您可以使用mb_detect_encoding$msg和$key来检查它以确保。
如果仍有问题,请尝试:

$mail->CharSet = 'UTF-8';  

PHPmailer有时编码可能会很痛苦。
希望这对:)有所帮助