PHP兑换密钥页面问题:无法检测并移除密钥求排查
你的PHP兑换密钥代码中的明显问题及修复方案
我帮你梳理下代码里的几个关键错误,这些就是导致功能失效的核心原因:
文件打开模式错误:你用
fopen("./generatedkeys.txt", "a")打开文件,"a"是追加模式,文件指针会直接跳到文件末尾,fgets根本读不到任何内容,自然没法检测密钥。应该用只读模式"r",或者更推荐直接用file()函数一次性读取文件内容,避免手动处理文件指针的麻烦。错误传递参数给
file_get_contents:file_get_contents需要接收文件路径字符串,你却传了$file(文件句柄),这会直接导致函数调用失败,根本拿不到文件内容,也就没法替换和删除密钥。过早关闭文件句柄:你在
foreach循环里的fclose($file),第一次循环就把文件关了,后续所有操作都会因为文件已关闭而报错。而且就算密钥没匹配到,这个关闭操作也会提前执行,逻辑完全不对。fgets保留换行符导致匹配失败:fgets读取每行内容时会自带末尾的换行符(\n),但你对比的hash("sha256", $gkey)是没有换行符的哈希值,就算密钥本身正确,也会因为多了换行符导致匹配失败。未定义的
$hwid变量:代码里用到了$hwid但完全没定义,这会抛出Undefined variable的错误,直接中断后续写入accs.txt的操作。读写逻辑混乱:边读取文件边修改文件内容,很容易出现文件锁定、内容读取不完整的问题,更安全的做法是先把所有密钥读到内存里处理,再一次性写回文件。
修复后的代码示例
<?php // 先检查必要的GET参数是否存在 if (!isset($_GET["key"])) { die("请提供兑换密钥"); } // 假设你需要从请求中获取HWID,这里根据实际场景调整(比如POST/COOKIE等) $hwid = $_GET["hwid"] ?? ''; if (empty($hwid)) { die("请提供HWID信息"); } $gkey = $_GET["key"]; $targetHash = hash("sha256", $gkey); $keyFilePath = "./generatedkeys.txt"; $accFilePath = "./accs.txt"; // 读取所有密钥到数组,自动忽略换行符和空行 $generatedKeys = file($keyFilePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $keyFound = false; foreach ($generatedKeys as $index => $key) { if ($key === $targetHash) { // 移除匹配到的密钥 unset($generatedKeys[$index]); $keyFound = true; break; } } if ($keyFound) { // 将处理后的密钥数组写回文件 file_put_contents($keyFilePath, implode("\n", $generatedKeys) . "\n"); // 写入accs.txt,注意原代码里hash("sha256", $key)是对已哈希的密钥再次哈希,根据你的需求调整 file_put_contents($accFilePath, hash("sha256", $key) . "," . hash("sha256", $hwid) . "\n", FILE_APPEND); echo "密钥兑换成功!"; } else { echo "无效的兑换密钥!"; }
额外提示
file()函数比手动fopen+fgets更简洁,自带的参数能帮你处理换行符和空行,避免匹配问题。- 先在内存中处理密钥数组,再一次性写入文件,彻底避免了文件读写冲突的问题。
- 增加了参数检查,能提前拦截非法请求,避免未定义变量的错误。
- 确保
generatedkeys.txt和accs.txt有合适的读写权限,否则PHP会无法操作文件。
内容的提问来源于stack exchange,提问作者Cottient
相关产品推荐
相关产品推荐

