在windows中的shell_exec PHP浏览器上隐藏命令用法参数

时间:2012-06-10 02:03:07

标签: php shell-exec traceroute

我基于traceroute web。我使用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);
        }
...

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

3 个答案:

答案 0 :(得分:1)

考虑这两行的作用:

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

您可能会发现在运行命令之前立即打印$host的值是有益的。你已经从你的主机名中删除了所有数字和字母 - 你究竟打算查找什么?

我可以理解您正在积极剥离输入以避免shell command injection vulnerability

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

答案 1 :(得分: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

答案 2 :(得分: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 hide / unhide”