我正在尝试在php中设置随机密码生成器功能,但这对我不起作用。我收到错误:
注意:第12行的C:\ xampp \ htdocs \ php-testing \ index.php中的数组到字符串转换
阵列
我做错了什么?
<?php
function pwGenerator($len = 10) {
$charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
$pw = array();
$length = strlen($charRange);
for ($x = 0; $x < $len; $x++) {
$n = rand(0, $length);
$pw[] = $charRange[$n];
}
return $pw;
}
echo pwGenerator();
答案 0 :(得分:3)
您无法直接将数组转换为字符串。因此,不是将其存储在数组中,而是可以使用字符串附加字符。现在它正在发挥作用。
<?php
function pwGenerator($len = 10) {
$charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
$pw = null;
$length = strlen($charRange);
for ($x = 0; $x < $len; $x++) {
$n = rand(0, $length);
$pw .= $charRange[$n];
}
return $pw;
}
echo pwGenerator();
?>
答案 1 :(得分:0)
试试这个
你应该将 $ pw 定义为字符串而不是数组
和$pw.=
连接像这样的字符串序列
<?php
function pwGenerator($len = 10) {
$charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
$pw ='';
$length = strlen($charRange);
for ($x = 0; $x < $len; $x++)
{
$n = rand(0, $length);
$pw.= $charRange[$n];
}
return $pw;
}
echo pwGenerator();
?>
答案 2 :(得分:0)
我认为你的错误是不需要将$pw
声明为数组声明为普通字符串变量。尝试下面的代码工作。
<?php
function pwGenerator($len = 10) {
$charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
$pw = "";
$length = strlen($charRange);
for ($x = 0; $x < $len; $x++) {
$n = rand(0, ($length-1));
$pw .= $charRange[$n];
}
return $pw;
}
echo pwGenerator();
?>
你的返回单个密码字符串值所以不需要像Array简单声明字符串变量那样去掉。它可以帮助你。
答案 3 :(得分:0)
更快的方法可能是对字符集进行随机播放,然后抓取适当长度的字符串。
function random_password( $length = 10 ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?";
$substr_length = 3;
if( $length > $substr_length ) {
$password = '';
while ( strlen($password) < $length) {
$current_length = strlen( $password );
$substr_length = ($length - $current_length) > $substr_length ? $length - $current_length : $current_length;
$password .= substr( str_shuffle( $chars ), 0, $substr_length );
}
} else {
$password = substr( str_shuffle( $chars ), 0, $length );
}
return $password;
}
答案 4 :(得分:0)
我就是这样做的。由于允许字符重复并使用mt_rand()
,因此它不仅速度快,而且比其他一些更加随机(因此更安全)。
function generateRandomPassword($length = 10)
{
static $chars = 'abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()';
static $charsLength = strlen($chars);
$randomPassword = '';
for ($i = 0; $i < $length; ++$i)
{
$randomPassword .= $chars[mt_rand(0, $charsLength - 1)];
}
return $randomPassword;
}
将$chars
和$charsLength
声明为static
可能过度,但确实会带来性能提升。此外,mt_rand()
比rand()
更安全。
您收到的有关“数组到字符串转换”的原始错误是因为您从函数返回了一个数组。如果你想解决这个问题,只需更改:
return $pw;
要:
return implode('', $pw);
答案 5 :(得分:0)
它可以是一个简单的解决方案。
$arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T',
'W', 'Y', '@', '#', '$', '*', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
'd', 'e', 'f', 'g', 'h', 'm', 'n', 'p', 'q', 'r', 't', 'u', 'w', 'y', 'z');
$arr2 = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M', 'N',
'P', 'Q', 'R', 'T', 'W', 'Y', 'a', 'b', 'd', 'e', 'f', 'g', 'h', 'm',
'n', 'p', 'q', 'r', 't', 'u', 'w', 'y', 'z');
$rnd = array_random($arr, 4);
$rnd2 = array_random($arr2, 2);
$password = $rnd2[0].$rnd[0].$rnd[1].$rnd[2].$rnd[3].$rnd2[1];
第一个和最后一个字符将只是Letter。中间字符为字母,数字或特殊字符。
答案 6 :(得分:0)
可靠的密码您只能使用 ascii 字符 a-zA-Z和数字0-9 。要做到这一点,最好的方法是使用加密安全方法,例如PHP7中的 random_int()或 random_bytes()。 Rest函数as base64_encode()您只能用作支持函数来提高字符串的可靠性,并将其更改为 ASCII 字符。
rand()不安全且非常老。 从任何字符串您必须使用random_int()。从二进制字符串您应该使用base64_encode()使二进制字符串可靠或bin2hex,但是然后您将字节仅切换到16个位置(值)。 See my implementation of this functions.