POST表单数据传递与GET重定向问题求助(附PHP代码)
问题修复方案
1. 密码哈希计算错误修复
原代码中盐值处理逻辑错误,导致生成的哈希值与存储的stored_hash无法匹配:
- 错误逻辑:先单独对盐值做MD5哈希,再拼接用户密码计算最终哈希
- 正确逻辑:直接将原始盐值与用户输入的密码拼接后计算哈希,这才是与存储哈希对应的生成方式
2. 重定向失效的核心原因
报错"expected a POST to redirect to a GET but received POST",通常是因为在发送header()重定向指令之前有输出内容(比如文件开头的空格、换行、前置HTML标签等),导致HTTP头无法正常发送,重定向失败后请求仍保持POST方法。
修正后的完整代码
<?php $salt = 'XyZzy12*_'; $stored_hash = '1a52e17fa899cf40fb04cfc42e6352f1'; //$stored_hash = 'a8609e8d62c043243c4e201cbb342862'; // 对应密码 meow123 $failure = false; // 初始状态:无POST提交数据 // 处理POST请求 if (isset($_POST['who']) && isset($_POST['pass'])) { if (strlen($_POST['who']) < 1 || strlen($_POST['pass']) < 1) { $failure = "用户名和密码不能为空"; } else { // 正确计算哈希:原始盐值 + 用户输入密码 $check = hash('md5', $salt . $_POST['pass']); if ($check == $stored_hash) { // 确保执行重定向前无任何输出 header("Location: game.php?name=" . urlencode($_POST['who'])); exit; // 终止脚本执行,避免后续代码干扰重定向 } else { $failure = "密码错误"; } } } ?>
额外注意事项
- 确保PHP文件的最开头没有任何空格、换行或HTML代码,
<?php标签必须是文件的第一个字符,否则header()指令会失效。 - 若需验证第一个
stored_hash对应的密码,可通过反向生成验证:执行echo hash('md5', 'XyZzy12*_' . '目标密码');,将结果与stored_hash对比。 - 用
exit替代原代码的return,更明确地终止当前脚本,避免后续潜在的输出干扰重定向。
内容的提问来源于stack exchange,提问作者LIKEUFACK CHRIST
相关产品推荐
相关产品推荐

