我正在尝试在 PHP 中创建一个随机字符串,我绝对没有输出:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
我究竟做错了什么?
要具体回答这个问题,有两个问题:
$randstring
不在范围内。 这是一个带有更正的代码片段:
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
使用以下调用输出随机字符串:
// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();
请注意,这会生成可预测的随机字符串。如果要创建安全令牌, 请参阅此答案 。
注意:
str_shuffle()
内部使用rand()
,这不适合加密(例如生成随机密码)。你想要一个安全的随机数发生器 。它也不允许重复字符。
UPDATED (现在生成任意长度的字符串):
function generateRandomString($length = 10) {
return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}
echo generateRandomString(); // OR: generateRandomString(24)
而已。 :)
这个问题有很多答案,但没有一个利用密码安全伪随机数发生器 (CSPRNG)。
简单,安全和正确的答案是使用RandomLib并且不要重新发明轮子。
对于那些坚持发明自己的解决方案的人,PHP 7.0.0 将为此提供random_int()
; 如果你仍然使用 PHP 5.x,我们为random_int()
编写了一个PHP 5 random_int()
这样你甚至可以在升级到 PHP 7 之前使用新的 API。
在 PHP 中安全地生成随机整数并非易事。在生产中部署本地算法之前,应始终与驻留的 StackExchange 加密专家核实。
使用安全的整数生成器,使用 CSPRNG 生成随机字符串就是在公园散步。
/**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length How many characters do we want?
* @param string $keyspace A string of all possible characters
* to select from
* @return string
*/
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
用法 :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
演示 : https ://3v4l.org/b4PST(忽略 PHP 5 失败; 它需要 random_compat)