如何用.ini文件实现仅允许唯一$_GET请求的PHP脚本?
用PHP+INI文件实现你的需求
当然可以!完全不需要数据库,用INI文件就能实现你要的生成和验证功能,而且实现起来逻辑清晰。下面我给你详细拆解方案,附带可直接运行的代码:
核心思路
咱们用INI文件来存储所有当前有效的验证代码——结构非常简单,每个生成的代码作为键,值随便设个标记(比如1)就行,因为我们只需要判断代码是否存在。每次调用?create=xxx时生成唯一的随机代码并存入INI;调用?verify=xxx时检查代码是否存在,存在就返回true并删除该代码,否则返回false。
完整代码实现
<?php // 定义INI文件的存储路径,建议放在Web根目录之外,避免被直接访问 $iniPath = __DIR__ . '/valid_codes.ini'; // 初始化文件:如果INI文件不存在,创建一个空文件 if (!file_exists($iniPath)) { file_put_contents($iniPath, '', LOCK_EX); } // 处理创建代码的请求 if (isset($_GET['create'])) { // 生成6位安全的随机字母数字代码(可调整长度) do { // 用random_bytes生成安全随机字节,转成base64后替换特殊字符 $randomBytes = random_bytes(4); $code = rtrim(strtr(base64_encode($randomBytes), '+/', '0a'), '='); // 读取现有代码,确保生成的代码唯一 $existingCodes = parse_ini_file($iniPath); } while (isset($existingCodes[$code])); // 将新代码写入INI文件,加独占锁防止并发冲突 $existingCodes[$code] = 1; $iniContent = ''; foreach ($existingCodes as $key => $val) { $iniContent .= "$key=$val\n"; } file_put_contents($iniPath, $iniContent, LOCK_EX); // 返回生成的代码 echo $code; exit; } // 处理验证代码的请求 if (isset($_GET['verify'])) { $targetCode = $_GET['verify']; $result = false; // 打开文件并加独占锁,避免并发读写问题 $fileHandle = fopen($iniPath, 'r+'); if (flock($fileHandle, LOCK_EX)) { // 读取文件内容并解析为数组 $fileContent = fread($fileHandle, filesize($iniPath)); $existingCodes = parse_ini_string($fileContent); // 检查代码是否存在 if (isset($existingCodes[$targetCode])) { $result = true; // 删除该代码 unset($existingCodes[$targetCode]); // 重新生成INI内容并写入 $newIniContent = ''; foreach ($existingCodes as $key => $val) { $newIniContent .= "$key=$val\n"; } ftruncate($fileHandle, 0); rewind($fileHandle); fwrite($fileHandle, $newIniContent); } // 释放锁并关闭文件 flock($fileHandle, LOCK_UN); fclose($fileHandle); } // 返回验证结果 echo $result ? 'true' : 'false'; exit; } // 处理无效请求 echo 'Invalid request parameter'; ?>
关键细节说明
- 并发安全:代码中使用了
LOCK_EX独占锁,确保多个请求同时读写INI文件时不会出现数据丢失或错乱的问题 - 代码唯一性:生成代码时会循环检查现有代码,保证每次生成的代码都是唯一的
- 安全建议:
- 把INI文件放在Web根目录之外,防止被访客直接下载获取所有有效代码
- 可以给
create参数加长度限制,比如最多20个字符,避免恶意输入 - 对
verify参数做过滤,只允许字母数字(因为我们生成的代码只有这两类字符)
- 权限设置:确保Web服务器的运行用户(比如
www-data)对INI文件有读写权限,否则会出现无法写入的错误
内容的提问来源于stack exchange,提问作者ya_Bob_Jonez
相关产品推荐
相关产品推荐

