我基于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);
}
...
我需要的是隐藏traceroute的帮助用法,就像在我的html代码中一样。因此,当我第一次加载页面时,它只显示文本字段,按钮和地图,而不使用tracert。 我真的需要你的帮助。十分感谢。
答案 0 :(得分:1)
考虑这两行的作用:
$host= preg_replace ("[-a-z0-9!#$%&\'*+/=?^_`{|}~]","",$host);
$command = "tracert $host";
您可能会发现在运行命令之前立即打印$host
的值是有益的。你已经从你的主机名中删除了所有数字和字母 - 你究竟打算查找什么?
我可以理解您正在积极剥离输入以避免shell command injection vulnerability。
而不是剥离字符,而不是保留特定字符。仅保留[a-z0-9:.-]
。 (我不知道在PHP中表达这一点的最佳方式。在括号内.
仅表示.
。在您使用的任何工具中保留该含义。)(:
是对于具有数字名称的IPv6主机。如果您不想允许IPv6,请随意抛弃它。)
答案 1 :(得分:1)
使用exec而不是shell_exec。你可以提供命令,一个接收输出的变量,一个变量来接收状态,而不是在exec的返回中捕获它。
http://www.php.net/manual/en/function.exec.php
另外,请使用escapeshellcmd和escapeshellarg来清理命令http://www.php.net/manual/en/function.escapeshellcmd.php。
答案 2 :(得分: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”