PHP代码IP查询逻辑失效,疑似跳过else分支问题求助
问题:仅输入IP查询时PHP脚本跳过else分支失效
我熟悉bash脚本编写,但刚接触PHP。我编写了一段从HTML表单加载变量的代码,输入域名进行查询时功能正常,但仅输入IP地址查询时完全失效,似乎跳过了整个else分支。以下是我的代码:
<?php header('Content-type: text/plain'); if(isset($_GET['subject1'], $_GET['subject2'])) { $text1 = $_GET['subject1']; $text2 = $_GET['subject2']; $text1 = escapeshellarg($text1); $text2 = escapeshellarg($text2); echo "THE VARIABLES THAT YOU HAVE SUBMITTED ARE " . "\n"; echo "You entered $text1 for the Domain Name " . "\n"; echo "You entered $text2 for the IP Address " . "\n"; echo "\n"; } if (!empty($text1)) { $command1 = '/usr/bin/dig ' . '@localhost ' . "$text1 " . "+short " . "| /usr/bin/tail -n1" . "\n"; echo "\n"; echo "THE COMMAND THAT YOU HAVE SUBMITTED WILL THEREFORE BE " . "\n"; print_r($command1) . "\n"; echo "\n"; $output1 = shell_exec($command1); echo "\n"; echo "RESULTS OF A EXTERNAL DNS (NAME TO IP) LOOKUP FOR THE DOMAIN ENTERED" . "\n"; echo "$output1"; echo "\n"; $command2 = '/usr/bin/whois ' . "$text1" . "\n"; echo "\n"; $output2 = shell_exec($command2); echo "\n"; echo "RESULTS OF A WHOIS LOOKUP AGAINST " . "$text1 " . "\n"; echo "$output2"; echo "\n"; $command3 = '/usr/bin/whois ' . "$output1" . "\n"; echo "\n"; $output3 = shell_exec($command3); echo "\n"; echo "RESULTS OF A WHOIS LOOKUP AGAINST " . "$output1 " . "\n"; echo "$output3"; echo "\n"; goto END; } else { $command4 = '/usr/bin/whois ' . "$text2" . "\n"; echo "\n"; $output4 = shell_exec($command4); echo "\n"; echo "RESULTS OF A WHOIS LOOKUP AGAINST " . "$text2 " . "\n"; echo "$output4"; echo "\n"; goto END; } END: echo "END OF THE TEST RESULTS " . "\n"; ?>
域名查询功能正常,但IP地址查询部分完全被跳过,请问我哪里出错了?
问题原因与修复方案
核心错误点
- 判断逻辑被转义后的字符串干扰:当仅输入IP时,
subject1是空字符串提交,isset($_GET['subject1'], $_GET['subject2'])条件会成立(isset只检查变量是否存在,不管值为空)。此时$text1被赋值为空字符串,经过escapeshellarg()处理后会变成''(带单引号的非空字符串),导致!empty($text1)返回true,代码会进入域名查询的if分支,而非预期的IP查询else分支。 - 变量未初始化风险:若用户未提交某个参数,
$text1或$text2会未定义,触发PHP警告。 - 命令中的多余换行符:给命令字符串末尾加的
\n会被shell当成命令的一部分,可能导致执行异常。
修复后的代码
<?php header('Content-type: text/plain'); // 初始化变量并处理原始输入,trim去除首尾空白 $rawDomain = isset($_GET['subject1']) ? trim($_GET['subject1']) : ''; $rawIP = isset($_GET['subject2']) ? trim($_GET['subject2']) : ''; // 仅当原始输入非空时,转义用于shell命令的参数 $domain = !empty($rawDomain) ? escapeshellarg($rawDomain) : ''; $ip = !empty($rawIP) ? escapeshellarg($rawIP) : ''; // 输出提交的变量 echo "THE VARIABLES THAT YOU HAVE SUBMITTED ARE \n"; echo "You entered $domain for the Domain Name \n"; echo "You entered $ip for the IP Address \n\n"; // 根据原始输入的空值状态选择执行逻辑 if (!empty($rawDomain)) { // 域名查询逻辑 $command1 = '/usr/bin/dig @localhost ' . $domain . ' +short | /usr/bin/tail -n1'; echo "\nTHE COMMAND THAT YOU HAVE SUBMITTED WILL THEREFORE BE \n"; echo $command1 . "\n\n"; $output1 = shell_exec($command1); echo "\nRESULTS OF A EXTERNAL DNS (NAME TO IP) LOOKUP FOR THE DOMAIN ENTERED\n"; echo $output1 . "\n"; $command2 = '/usr/bin/whois ' . $domain; $output2 = shell_exec($command2); echo "\nRESULTS OF A WHOIS LOOKUP AGAINST " . $domain . "\n"; echo $output2 . "\n"; // 仅当DNS查询返回有效IP时,执行IP的whois查询 $cleanIP = trim($output1); if (!empty($cleanIP)) { $command3 = '/usr/bin/whois ' . escapeshellarg($cleanIP); $output3 = shell_exec($command3); echo "\nRESULTS OF A WHOIS LOOKUP AGAINST " . $cleanIP . "\n"; echo $output3 . "\n"; } } elseif (!empty($rawIP)) { // IP查询逻辑 $command4 = '/usr/bin/whois ' . $ip; $output4 = shell_exec($command4); echo "\nRESULTS OF A WHOIS LOOKUP AGAINST " . $ip . "\n"; echo $output4 . "\n"; } else { echo "\nPlease enter either a Domain Name or an IP Address.\n"; } echo "\nEND OF THE TEST RESULTS \n"; ?>
修复关键点
- 基于原始输入判断分支:用
$rawDomain和$rawIP的空值状态触发分支,避免escapeshellarg()处理后的字符串干扰判断逻辑。 - 提前初始化变量:避免未定义变量的警告,提升代码健壮性。
- 移除命令中的换行符:确保shell命令能正确执行。
- 增加空输入提示:当两个输入都为空时给出明确提示。
- 优化IP whois查询触发条件:仅当DNS查询返回有效IP时才执行对应逻辑,避免无效命令。
内容的提问来源于stack exchange,提问作者Blacktip69
相关产品推荐
相关产品推荐

