<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
checkToken
checkToken 调用似乎接受了三个参数:
- 第一个参数 $_REQUEST['user_token'] 可能是指来自客户端(例如通过 HTTP 请求)收到的令牌。
- 第二个参数 $_SESSION['session_token'] 可能是指服务器端(在 PHP 的会话存储)保存的会话令牌。
- 第三个参数 'index.php' 可能是在令牌验证失败时将用户重定向到的URL。
以下是该功能可能的工作方式:
- 从此处检索与 $_REQUEST['user_token'] 关联的用户 ID 数据库或缓存。
- 将检索到的用户 ID 与《$_SESSION['session_token']》值进行比较。
- 如果 ID 匹配,请继续当前请求。
- 如果 ID 不匹配或任一令牌无效,请将用户重定向到 'index.php'。
function checkToken($clientToken, $sessionToken, $redirectUrl) {
if (!isset($_SESSION['user_id'])) {
session_start();
}
// 获取与客户端令牌关联的用户 ID
$userId = getUserIdFromToken($clientToken);
// 将来自客户端令牌的用户 ID 与会话令牌进行比较
if ($userId != $_SESSION['user_id']) {
header('Location: ' . $redirectUrl);
exit;
}
}
function getUserIdFromToken($token) {
// 查询数据库或缓存以获取与令牌关联的用户 ID
// 如果成功,请返回用户 ID;否则返回null
}
stripslashes
srtipslashes() 是 PHP 内置的一个函数,它的作用是从字符串中去除转义反斜杠(\)。
它仅接受一个参数:即要清除转义反斜杠的字符串。
$text = "It's a beautiful day!";
echo stripslashes($text); // 输出:"It's a beautiful day!"
explode
《explode》函数在 PHP 中的作用是根据指定的分隔符将字符串拆分为数组。
// Split string into pieces separated by commas
$array = explode(",", "apple,banana,orange,mango");
is_numericis_numeric() 是 PHP 中的一个内置函数,用于判断变量是否为数字
bool is_numeric(mixed $var)
stristr
stristr() 是 PHP 中的一个内置函数,用于查找字符串在另一字符串中第一次出现的位置。如果成功,则返回字符串的其余部分(从匹配点)。
该函数接受两个参数:
- 第一个参数是要搜索的目标字符串。
- 第二个参数是要在目标字符串中搜索的模式或子字符串。
与 strstr() 函数不同的是, stristr() 不区分大小写。
$string = 'hello world';
$substring = 'world';
if ($position = stristr($string, $substring)) {
echo substr($position, strlen($substring));
} else {
echo 'Substring not found.';
}
// 输出: ' '
在字符串 $string 中查找子字符串 $substring 。因为找到了匹配项,所以 substr() 函数从匹配点起始返回剩余的字符串。
如果未找到子字符串,则 stristr() 函数返回 FALSE 或者空字符串
php_uname
php_uname() 是 PHP 的内置函数,它可以返回底层操作系统的信息。这包括操作系统名称、版本号、机器架构、主机名等信息。
此函数接受一个可选的单字符参数,用于指定要返回的信息类型。以下是可用选项:
- 'a': 返回所有可用信息,以 's n r v m' 的形式返回一个字符串。
- 's': 返回操作系统的名称(例如 Linux 或 Windows)。
- 'n': 返回主机名。
- 'r': 返回操作系统的发行版。
- 'v': 返回操作系统的版本。
- 'm': 返回机器架构(例如 x86_64)。
echo php_uname();
在本地计算机上运行这段代码,你应该会看到类似于以下的输出:
Linux localhost.localdomain 3.10.0-1062.12.1.el7.x86_64 #1 SMP Thu Sep 5 16:10:½
shell_exec
shell_exec() 是 PHP 内置函数之一,用于执行系统命令并将输出作为字符串返回。
$output = shell_exec("ls -l");
echo $output;
上述代码将会执行终端中的 ls -l 命令,并将输出赋值给 $output 变量。
shell_exec() 返回完整命令的输出字符串,这是区别于其他类似函数的地方。以下是几种不同的 PHP 执行命令的方法以及它们之间的区别:
- exec(): 会忽略命令的输出;
- system(): 将命令的输出直接输出至屏幕;
- passthru(): 类似于 exec(),但它直接输出命令的输出。 注:尽量不要使用 shell_exec() 在生产环境中执行危险命令,因为它会将环境暴露给潜在攻击者。
generateSessionToken
使用 PHP 自带的函数生成随机字符串作为会话令牌。
这里是一种实现 generateSessionToken 函数的方式:
function generateSessionToken($length = 32) {
return bin2hex(random_bytes($length));
}