如何在URL显示前哈希GET参数?PHP编码函数实现需求
实现步骤与完整代码
要实现把URL中的明文ID替换为编码后的哈希值,核心思路是在服务器端接收明文ID后完成编码,再重定向到带有编码后ID的URL,这样地址栏就会显示编码后的参数了。下面是具体的实现方案:
1. 确保PHP编码/解码函数就绪
首先你需要确保那三个函数已经正确定义,这里我假设你的函数逻辑类似下面的示例(如果已有自己的实现,可以直接替换):
function generate_xor_key($length = 8) { // 若使用随机密钥,需存在Session中保证编码解码一致 if (!isset($_SESSION['xor_key'])) { $_SESSION['xor_key'] = bin2hex(random_bytes($length)); } return $_SESSION['xor_key']; } function encode_id($plain_id, $key) { $plain_str = strval($plain_id); $encoded = ''; $key_len = strlen($key); // XOR异或编码逻辑 for ($i = 0; $i < strlen($plain_str); $i++) { $encoded .= chr(ord($plain_str[$i]) ^ ord($key[$i % $key_len])); } // 转成可安全传输的数字格式(匹配你示例中的4256565样式) return abs(unpack('N', $encoded)[1]); } function decode_id($encoded_id, $key) { $encoded_str = pack('N', $encoded_id); $decoded = ''; $key_len = strlen($key); // 对应编码的解码逻辑 for ($i = 0; $i < strlen($encoded_str); $i++) { $decoded .= chr(ord($encoded_str[$i]) ^ ord($key[$i % $key_len])); } return intval($decoded); }
2. 完整的PHP页面实现
把表单和处理逻辑整合到同一个PHP文件中,代码如下:
<?php // 启动Session(如果使用随机密钥必须开启) session_start(); // 这里放入你的generate_xor_key、encode_id、decode_id函数 function generate_xor_key($length = 8) { if (!isset($_SESSION['xor_key'])) { $_SESSION['xor_key'] = bin2hex(random_bytes($length)); } return $_SESSION['xor_key']; } function encode_id($plain_id, $key) { $plain_str = strval($plain_id); $encoded = ''; $key_len = strlen($key); for ($i = 0; $i < strlen($plain_str); $i++) { $encoded .= chr(ord($plain_str[$i]) ^ ord($key[$i % $key_len])); } return abs(unpack('N', $encoded)[1]); } function decode_id($encoded_id, $key) { $encoded_str = pack('N', $encoded_id); $decoded = ''; $key_len = strlen($key); for ($i = 0; $i < strlen($encoded_str); $i++) { $decoded .= chr(ord($encoded_str[$i]) ^ ord($key[$i % $key_len])); } return intval($decoded); } // 处理表单提交:接收明文ID,编码后重定向 if (isset($_GET['submit']) && !empty($_GET['id'])) { $plain_id = $_GET['id']; // 验证输入是合法数字,避免非法请求 if (is_numeric($plain_id)) { $key = generate_xor_key(); $encoded_id = encode_id($plain_id, $key); // 重定向到带编码后ID的URL header("Location: ?id=$encoded_id&submit=Encode"); exit(); // 重定向后必须终止脚本执行 } } // 处理编码后的ID:解码并显示明文(可选,用于验证) $decoded_id = null; if (isset($_GET['id']) && is_numeric($_GET['id']) && isset($_GET['submit'])) { $encoded_id = $_GET['id']; $key = generate_xor_key(); $decoded_id = decode_id($encoded_id, $key); } ?> <!DOCTYPE html> <html> <head> <title>ID Encoder</title> </head> <body> <form action="" method="GET"> 输入消息ID: <input type="text" name="id" value="<?php echo isset($_GET['id']) ? htmlspecialchars($_GET['id']) : ''; ?>"> <input type="submit" name="submit" value="Encode"> </form> <?php if ($decoded_id !== null): ?> <p>解码后的明文ID: <?php echo htmlspecialchars($decoded_id); ?></p> <?php endif; ?> </body> </html>
3. 关键细节说明
- Session的作用:如果你的
generate_xor_key生成的是随机密钥,必须用Session存储密钥,这样编码和解码时用的是同一个密钥,否则无法正确解码。如果使用固定密钥,可去掉Session相关代码,直接定义一个固定的$key变量。 - 重定向逻辑:当用户提交明文ID后,服务器不会直接返回页面,而是通过
header("Location: ...")跳转到带有编码后ID的URL,这样地址栏就会显示编码后的id参数。 - 安全防护:用
htmlspecialchars()输出用户输入的内容,防止XSS攻击;同时验证输入是否为数字,避免恶意输入破坏编码逻辑。 - 编码格式适配:如果你的
encode_id返回的不是数字(比如base64字符串),需要用urlencode($encoded_id)处理后再放入URL,确保参数能安全传输。
内容的提问来源于stack exchange,提问作者Andreas Hunter
相关产品推荐
相关产品推荐

