在窗口中隐藏shell_exec PHP 浏览器上的命令使用参数



我使跟踪路由基于网络。我使用shell_exec来执行该过程并通过浏览器显示输出。我在浏览器上调用页面的第一个时遇到问题。有 tracert 命令显示的用法。我尝试通过将脚本放在函数中来隐藏它。是的,它可以工作,但是当我开始加载页面时,另一个元素(如地图)没有显示。这是我的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 代码中一样。因此,当我第一次加载页面时,它只显示文本字段、按钮和地图,而不使用 tracert。我真的需要你的帮助尽快。非常感谢。

不要使用

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

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

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

考虑这两行的作用:

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

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

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

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

如果我理解实际问题,您只是不想在没有输入时运行和输出命令。你已经有

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 隐藏/取消隐藏"

最新更新