Я делаю веб-сайт traceroute. Я использую shell_exec для выполнения процесса и отображения вывода через браузер. У меня проблема с первым вызовом страницы в браузере. Существует использование команды tracert command 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("^[az]", $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. Мне очень нужна ваша помощь как можно скорее. Большое спасибо.
Вместо shell_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
непосредственно перед запуском вашей команды. Вы удалили все номера и буквы с вашего имени хоста – что именно вы намерены искать?
Я могу понять, что вы агрессивно снимаете входные данные, чтобы избежать уязвимости, вызванной командной оболочкой .
Вместо того, чтобы снимать символы, вы должны вместо этого сохранять определенные символы. Храните только [a-z0-9:.-]
. (Я не знаю, как лучше всего выразить это на PHP. В скобках это означает только …. Сохраните это значение в любом инструменте, который вы используете.) (The :
для хостов 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 тоже достаточно лёгкий. Просто google для «js hide / unhide»