1

我使 traceroute 基于网络。我使用 shell_exec 执行该过程并通过浏览器显示输出。我第一次在浏览器上调用页面时遇到问题。有 tracert 命令 show 的用法。我尝试通过将脚本放在函数中来隐藏它。是的,它可以工作,但是当我开始加载页面时,另一个元素(如地图)没有显示。这是我的php代码:

<html>
<head>
<title></title>
<body>
<?
$host  = @$_POST['host']; 
$trace = @$_POST['trace'];
$self  = $_SERVER['PHP_SELF'];
?>
...
        <form name="tools" action="<?php $self ?>" method="post">
    <p><font size="2">Your IP is <?php $ip ?> </font></p>
    <input type="text" name="host" value=""></input>
    <input type="submit" name="trace" value="Traceroute!"></input>
    </form>
    <?php
    if ($_POST['submit']) 
{
    if (($host == 'Enter Host or IP') || ($host == "")) {
        echo '<br><br>You must enter a valid Host or IP address.';
        exit; } 

    if(eregi("^[a-z]",  $host))
    {
        $host_name = $host;
        $host_ip = gethostbyname($host);
    }
    else
    {
        $host_name = gethostbyaddr($host);
        $host_ip = $host;
    } 
}
    $host= preg_replace ("[-a-z0-9!#$%&\'*+/=?^_`{|}~]","",$host);
    $command = "tracert $host";
    $fp = shell_exec("$command 2>&1");
    $output .= (htmlentities(trim($fp)));
    echo "<pre>$output</pre>";
    echo '<br/>'; 
?>
...

</body>
</html>

以及 html 代码(浏览器输出):

'''
<form name="tools" action="" method="post">

    <p><font size="2">Your IP is  </font></p>

    <input type="text" name="host" value=""></input>

    <input type="submit" name="trace" value="Traceroute!"></input>

    </form>

    <pre>Usage: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] 
               [-R] [-S srcaddr] [-4] [-6] target_name

Options:
    -d                 Do not resolve addresses to hostnames.
    -h maximum_hops    Maximum number of hops to search for target.
    -j host-list       Loose source route along host-list (IPv4-only).
    -w timeout         Wait timeout milliseconds for each reply.
    -R                 Trace round-trip path (IPv6-only).
    -S srcaddr         Source address to use (IPv6-only).
    -4                 Force using IPv4.
    -6                 Force using IPv6.</pre><br/> <script type="text/javascript">

    var pinImage = new google.maps.MarkerImage ("http://chart.apis.google.com/chart?chst=d_map_xpin_letter_withshadow&chld=pin_star|%E2%80%A2|CC3300|000000|FF9900",

        new google.maps.Size (70, 83),

        new google.maps.Point (0,0),

        new google.maps.Point (10,34));

    var pinShadow = new google.maps.MarkerImage ("http://chart.apis.google.com/chart?chst=d_map_pin_shadow",

        new google.maps.Size (89, 85),

        new google.maps.Point (0, 0),

        new google.maps.Point (12, 35));



    function initialize() {

    var myLatlng = new google.maps.LatLng(38.822591, 150.46875);

    var myOptions = {

    zoom: 2,

    center: myLatlng,

    mapTypeId: google.maps.MapTypeId.ROADMAP,

    }

    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
        }
...

我需要的只是像在我的 html 代码中一样隐藏 traceroute 的帮助用法。因此,当我第一次加载页面时,它只显示文本字段、按钮和地图,而没有使用 tracert。我真的需要你尽快的帮助。非常感谢。

4

3 回答 3

1

考虑这两行的作用:

$host= preg_replace ("[-a-z0-9!#$%&\'*+/=?^_`{|}~]","",$host);
$command = "tracert $host";

$host您可能会发现在运行命令之前立即打印值很有启发性。您已经从主机名中删除了所有数字和字母——您到底打算查找什么?

我可以理解您正在积极地剥离输入以试图避免shell 命令注入漏洞

您应该保留特定字符,而不是剥离字符。只保留. (我不知道用 PHP 表达这一点的最佳方式。括号内仅表示。在您使用的任何工具中保持该含义。)(适用于具有数字名称的 IPv6 主机。如果您不这样做,请随意放弃它不想允许 IPv6。)[a-z0-9:.-]..:

于 2012-06-10T02:14:32.687 回答
1

使用 exec 而不是 shell_exec。您可以提供命令、接收输出的变量和接收状态的变量,而不是在 exec 的返回中捕获所有状态。

http://www.php.net/manual/en/function.exec.php

此外,请使用 escapeshellcmd 和 escapeshellarg 来清理您的命令,http: //www.php.net/manual/en/function.escapeshellcmd.php 。

于 2012-06-10T03:32:21.933 回答
0

如果我理解实际问题,那么您只是不想在没有输入的情况下运行并输出您的命令。你已经有了

if ($_POST['submit']) 
{

只需将其关闭移}过该代码即可:

       $host_ip = $host;
    } 
// removed from here
    $host= preg_replace ("[-a-z0-9!#$%&\'*+/=?^_`{|}~]","",$host);
    $command = "tracert $host";
    $fp = shell_exec("$command 2>&1");
    $output .= (htmlentities(trim($fp)));
    echo "<pre>$output</pre>";
    echo '<br/>'; 
} //added here

这对我来说似乎比使用 JS 更干净,但 JS 也很简单。只是谷歌“js隐藏/取消隐藏”

于 2013-06-01T10:49:18.450 回答