这里防止命令注入的思路是白名单,也就是说对输入进行过滤,只允许输入ip地址。
将输入的命令分成4段,每一段都判断一下是不是数字,总共是不是4段,如果是的话,再用点把4
段数字拼接起来,因此不存在命令注入。
if( isset( $_POST[ 'Submit' ] ) ) { //判断上传的Submit参数是否为空
// 在用户提交表单时验证表单 token 的有效性,以防止跨站点请求伪造(CSRF)攻击。
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//checkToken() 函数会检查用户传入的 user_token 和服务器存储的 session_token 是否相等,以此来验证用户的身份。其中,user_token 和session_token是分别存储在用户请求中和服务器会话中的令牌,用于防止CSRF攻击;index.php 则是当验证失败时将要跳转的页面。
//将客户端传递的 ip 参数值赋值给 $target 变量,使用REQUEST请求方式
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target ); //使用 stripslashes() 函数将其解除转义,并返回一个新的没有转义的字符串。
$octet = explode( ".", $target ); //explode() 函数用于将一个字符串按照“.”分隔符拆分成多个子字符串,并将这些子字符串存储在数组中。
//将一段 IP 地址字符串 $target 拆分成了一个数组 $octet,而每个数组元素均为一个字符串类型。要检查每个数组元素是否均为整数,我们可以遍历 $octet 数组,然后对于每个元素使用 is_numeric() 函数检查其是否为数值类型,如果是,则将其转换为整数类型进行后续操作。
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
//将一个包含 4 段 IP 地址的数组 $octet 拼接成一个完整的 IP 地址字符串,并将其赋值给 $target 变量。
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// 确定操作系统并执行ping命令。
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
//判断当前运行 PHP 代码的操作系统是否为 Windows NT。其中 php_uname('s') 函数会返回当前运行操作系统的信息。stristr() 函数则用于在返回的字符串中查找特定的子字符串,当查找到 'Windows NT' 这个字符串时,说明当前的操作系统是 Windows NT,返回 true,否则返回 false。
$cmd = shell_exec( 'ping ' . $target ); //使用shell_exec() 让ping与之前的重组的$target拼接成一条ping命令
}
else {
// linux
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user 最终对用户的反馈
echo "<pre>{$cmd}</pre>";
}
else {
//在网页中输出一条错误消息。
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token 生成反CSRF令牌
generateSessionToken(); //生成一个用于会话标识的随机字符串 token。