You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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地址查询部分完全被跳过,请问我哪里出错了?


问题原因与修复方案

核心错误点

  1. 判断逻辑被转义后的字符串干扰:当仅输入IP时,subject1是空字符串提交,isset($_GET['subject1'], $_GET['subject2'])条件会成立(isset只检查变量是否存在,不管值为空)。此时$text1被赋值为空字符串,经过escapeshellarg()处理后会变成''(带单引号的非空字符串),导致!empty($text1)返回true,代码会进入域名查询的if分支,而非预期的IP查询else分支。
  2. 变量未初始化风险:若用户未提交某个参数,$text1或$text2会未定义,触发PHP警告。
  3. 命令中的多余换行符:给命令字符串末尾加的\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:54:54