1

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);
        }
...

必要なのは、html コードのように traceroute のヘルプの使用を非表示にすることだけです。そのため、最初にページをロードすると、tracert を使用せずにテキスト フィールド、ボタン、およびマップが表示されます。できるだけ早くあなたの助けが必要です。本当にありがとう。

4

3 に答える 3

1

次の 2 行が何をするか考えてみましょう。

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

$hostコマンドを実行する直前にの値を表示すると、有益な場合があります。ホスト名からすべての数字と文字を削除しました。正確に何を調べるつもりですか?

シェル コマンド インジェクションの脆弱性を回避するために、積極的に入力を削除していることは理解できます。

文字を削除する代わりに、特定の文字を保持する必要があります。のみを保持し[a-z0-9:.-]ます。(これを PHP で表現する最善の方法がわかりません。角かっこ内.は のみ.を意味します。使用するツールが何であれ、その意味を保持してください。) (:は数値名を持つ IPv6 ホスト用です。 IPv6 を許可したくありません。)

于 2012-06-10T02:14:32.687 に答える
1

shell_exec の代わりに、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 hide / unhide」をグーグルで検索してください

于 2013-06-01T10:49:18.450 に答える