скрыть аргумент использования команды в браузере shell_exec PHP в Windows

Я делаю трассировку через Интернет. Я использую 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. Мне очень нужна ваша помощь как можно скорее. Большое спасибо.


person chumyee    schedule 10.06.2012    source источник
comment
.....Вы когда-нибудь слышали о Javascript?   -  person Steve    schedule 10.06.2012
comment
@dynamic: о чем конкретно ты думаешь?   -  person sarnold    schedule 10.06.2012
comment
Да, я тоже использовал его. И почему или что я должен делать?   -  person chumyee    schedule 10.06.2012
comment
Ну, он хочет скрыть <pre>Usage: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout]..и так далее, правильно? Просто используйте getelementbyid("id of <pre> here").style.display = "block"; и установите значение по умолчанию none. Или я совсем не понимаю вопроса?   -  person Steve    schedule 10.06.2012
comment
ну, вы перенаправляете stderr на stdout, если вы отбросите 2>&1, это остановится. Но вы получаете сообщение об ошибке, потому что вы передаете неправильный (или нет) $host в tracert.   -  person bkconrad    schedule 10.06.2012
comment
Да @dynamic, это то, что я имею в виду. Это обрабатывается с помощью Javascript ?? Не с PHP?? где я должен разместить код, как вы предлагаете ?? Благодарю вас.   -  person chumyee    schedule 10.06.2012
comment
Итак, мне нужно удалить 2›&1 ??   -  person chumyee    schedule 10.06.2012


Ответы (3)


Вместо shell_exec используйте exec. Вы можете указать команду, переменную для получения вывода и переменную для получения статуса вместо того, чтобы перехватывать все это в возврате exec.

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

Кроме того, используйте escapeshellcmd и escapeshellarg для очистки ваших команд, http://www.php.net/manual/en/function.escapeshellcmd.php.

person Mike Mackintosh    schedule 10.06.2012
comment
Хорошо, спасибо за предложение. поэтому, если я использую один из двух способов, указанных выше, команда использования не будет отображаться при первой загрузке страницы в браузере, не так ли? Поправьте меня если я ошибаюсь. Спасибо. - person chumyee; 10.06.2012
comment
Я пробовал их. Да, работает, но карта не отображается. Как еще можно попробовать?? Пожалуйста помоги. Благодарю вас ... - person chumyee; 11.06.2012

Рассмотрим, что делают эти две строки:

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

Вы можете найти поучительным вывести значение $host непосредственно перед запуском вашей команды. Вы удалили все цифры и буквы из своего имени хоста — что именно вы собираетесь искать?

Я могу оценить, что вы агрессивно удаляете ввод, чтобы попытаться избежать уязвимости внедрения команд оболочки.

Вместо удаления символов следует сохранить определенные символы. Оставьте только [a-z0-9:.-]. (Я не знаю, как лучше всего выразить это в PHP. В скобках . означает только .. Сохраняйте это значение в любом инструменте, который вы используете.) (: для хостов IPv6 с числовыми именами. Не стесняйтесь отказаться от него. если вы не хотите разрешать IPv6.)

person sarnold    schedule 10.06.2012
comment
Эй, @Sarnold, спасибо за твое предложение. но не могли бы вы объяснить это яснее, потому что я новичок и немного трудно понять. Если я оставлю только [a-z0-9:.], хост типа www.poltek-malang.ac.id не сможет работать из-за (-). Итак, из вашего предложения я ошибся в этих двух строках ?? как это исправить, но в вашем простом объяснении. Прошу прощения за слишком раздражающий мой вопрос. Благодарю вас. - person chumyee; 10.06.2012
comment
Как насчет удаления всех одинарных кавычек ' и заключения всего в пару одинарных кавычек? Разве это не предотвратит любую форму инъекции? - person nhahtdh; 10.06.2012
comment
@nhahtdh: я бы не очень доверял этому; ничто не сравнится с ограничением ввода известными хорошими персонажами. - person sarnold; 12.06.2012
comment
@chumyee: моя ошибка - да, вы также можете добавить -, просто убедитесь, что это первый или последний символ вашего класса персонажей. - person sarnold; 12.06.2012
comment
@sarnold, извините, что вы имеете в виду под первым или последним персонажем моего класса персонажей? Извините, что спрашиваю больше. Благодарю вас. - person chumyee; 12.06.2012
comment
Синтаксис [abc] в регулярных выражениях вводит класс символов; если вы поставите дефис, он будет выражать диапазон: [a-f], например, это [abcdef]. Если поставить дефис в начале или в конце, он превратится в просто дефис. - person sarnold; 12.06.2012

Если я понимаю реальный вопрос, вы просто не хотите запускать и выводить свою команду, когда нет ввода. У тебя уже есть

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 скрыть/показать"

person TecBrat    schedule 01.06.2013