PHP目录检测代码中URL HTTP状态码显示为0的修复请求
修复Dirbuster状态码全为0的问题
嘿,我帮你搞定这个状态码全显示0的问题啦!咱们先揪出问题根源,再给你修复好的代码:
问题出在哪?
你的代码里状态码全是0,主要是这几个小细节没处理到位:
- 换行符搞乱了URL:
fgets()读取字典每行时会带上末尾的换行符(\n),拼接后URL变成类似http://example.com/\ndir的无效格式,Curl请求失败就会返回状态码0。 - 没处理Curl请求失败的情况:如果遇到网络问题、URL格式错误等情况,Curl执行会失败,但原代码没捕获错误,只能看到状态码0,没法排查问题。
- 重复获取POST参数:循环里每次都重新读取
$_POST["thelink"],虽然不影响功能,但有点多余,提前拿到变量里更高效。
修复后的完整代码
<?php function dirSearch() { // 先验证用户输入的URL是否有效 if (!isset($_POST["thelink"]) || empty($_POST["thelink"])) { echo "请输入有效的URL!"; return; } // 处理URL,确保末尾有且只有一个斜杠 $baseUrl = rtrim($_POST["thelink"], "/") . "/"; // 打开字典文件,处理打开失败的情况 $file = fopen("wordlist1.txt", "r") or exit("无法打开wordlist1.txt文件,请检查路径和权限!"); // 逐行读取字典内容 while(($extension = fgets($file)) !== false) { // 去掉每行的换行符、空格等空白字符,跳过空行 $extension = trim($extension); if (empty($extension)) continue; // 拼接完整URL $url = $baseUrl . $extension; $ch = curl_init($url); // 设置Curl选项 curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 可选:如果不想自动跟随重定向,取消下面的注释 // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 执行Curl请求 $output = curl_exec($ch); // 检查请求是否成功 if ($output === false) { $errorMsg = curl_error($ch); echo "$url <b>请求失败</b>:->> <b><u>错误信息:$errorMsg</u></b> <br><br>"; } else { $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "$url <b>Response Code</b>:->> <b><u>$httpcode</u></b> <br><br>"; } // 关闭Curl资源 curl_close($ch); } // 关闭字典文件 fclose($file); } dirSearch(); ?>
关键改动说明
- URL格式处理:用
rtrim()去掉用户输入URL末尾多余的斜杠,再补一个,不管用户有没有加斜杠,都能保证拼接后的URL格式正确。 - 清理字典行内容:用
trim()去掉每行的换行符、空格,还跳过了空行,避免拼接出无效URL。 - 增加错误捕获:检查
curl_exec()的返回值,如果请求失败,直接输出Curl的错误信息,方便你排查问题(比如网络不通、URL无效等)。 - 优化变量逻辑:把用户输入的URL提前拿到循环外,避免重复读取POST参数,提升代码效率。
额外注意事项
- 确保你的服务器已经开启了PHP的Curl扩展(可以通过
phpinfo()查看)。 - 确认
wordlist1.txt文件的路径正确,并且PHP进程有读取这个文件的权限。
内容的提问来源于stack exchange,提问作者user7809383
相关产品推荐
相关产品推荐

