PHP可选字符集密码生成器启用特殊字符返回空字符串问题排查
问题根源
启用特殊字符选项后返回空的核心原因是变量类型不匹配:
- 小写字母、大写字母、数字三个字符集都用数组存储,唯独特殊字符
$special在开启时被赋值为字符串,调用array_merge()合并时会触发PHP类型错误,导致生成逻辑中断。 - 同时还存在几处容易导致异常的小问题:未对POST参数做存在性校验、生成循环用字符串类型数字做计数、密码变量
$password未初始化就拼接、HTML表单的maxlength属性拼写错误。
修复方案
1. 修改pass-gen.php逻辑
将特殊字符转为数组后再参与合并,同时补充参数校验和变量初始化:
<?php // 补充POST参数默认值,避免未勾选复选框时抛出未定义索引警告 $hidden = $_POST['hidden'] ?? ''; $form_a_z = $_POST['form_a_z'] ?? ''; $form_ab_zb = $_POST['form_ab_zb'] ?? ''; $form_zerro_one = $_POST['form_zerro_one'] ?? ''; $form_special = $_POST['form_special'] ?? ''; $form_amount_symbols_pass = (int)($_POST['form_amount_symbols_pass'] ?? 16); $form_amount_pass = (int)($_POST['form_amount_pass'] ?? 1); if ($form_amount_symbols_pass > 64) $form_amount_symbols_pass = 64; if ($form_amount_pass > 128) $form_amount_pass = 128; if ($hidden != "") { print('<div style="width:600px; padding:10px;"><font style="text-indent:7px; text-decoration:none; font-size:15px; font-weight:bold; color:#0094db;">生成结果<br><br></font>'); if ($form_a_z == 'y' || $form_ab_zb == 'y' || $form_zerro_one == 'y' || $form_special == 'y') { $az = $form_a_z == 'y' ? range("a", "z") : []; $az_big = $form_ab_zb == 'y' ? range("A", "Z") : []; $zerro_one = $form_zerro_one == 'y' ? range(0, 9) : []; // 特殊字符拆分为数组,统一类型后再合并 $special = $form_special == 'y' ? str_split('!@#$%^&*()-_+=~{}[]:;?<>') : []; $need_symbols = array_merge($az, $az_big, $zerro_one, $special); $count_symbols = count($need_symbols); $max_gen = $count_symbols - 1; // 计数变量改为数字类型 for ($i = 0; $i < $form_amount_pass; $i++) { $password = ''; // 提前初始化密码变量 for ($a = 0; $a < $form_amount_symbols_pass; $a++) { $gen_sym = mt_rand(0, $max_gen); $password .= $need_symbols[$gen_sym]; } print("$password<br>"); } } else { print('未选择任何字符集,无法生成密码'); } print('</div>'); } ?>
2. 修复index.php拼写错误+汉化界面
把错误的maxlenght修正为maxlength,同时把界面文本改为中文:
<table> <form name="forma" action="index.php" method="post"> <input type="hidden" name="hidden" value="y" /> <tr> <td>使用小写字母a-z - </td> <td valign="bottom"><input type="checkbox" name="form_a_z" value="y" checked /></td> </tr> <tr> <td>使用大写字母A-Z - </td> <td valign="bottom"><input type="checkbox" name="form_ab_zb" value="y" checked /></td> </tr> <tr> <td>使用数字0-9 - </td> <td valign="bottom"><input type="checkbox" name="form_zerro_one" value="y" checked /></td> </tr> <tr> <td>使用特殊字符 - </td> <td valign="bottom"><input type="checkbox" name="form_special" value="y" checked /></td> </tr> <tr> <td>密码长度(最大64位) - </td> <td valign="bottom"><input type="text" style="width:30px;" name="form_amount_symbols_pass" size="5" maxlength="5" value="16" /></td> </tr> <tr> <td>生成密码数量(最大128个) - </td> <td valign="bottom"><input type="text" style="width:30px;" name="form_amount_pass" size="5" maxlength="5" value="1" /></td> </tr> <tr> <td><input type="submit" value="生成密码" /> </form> </table>
内容的提问来源于stack exchange,提问作者holati7855
相关产品推荐
相关产品推荐

