我使跟踪路由基于网络。我使用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 隐藏/取消隐藏"