1.代码注入
①eval()
eval ( string $code ) : mixed
说明:eval()把字符串code 作为PHP代码执行。
Caution函数eval()语言结构是非常危险的,因为它允许执行任意PHP代码。它这样用是很危险的。如果您仔细的确认过,除了使用此结构以外别无方法,请多加注意,不要允许传入任何由用户提供的、未经完整验证过的数据。
PS:传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。
return 语句会立即中止当前字符串的执行。
代码执行的作用域是调用 eval() 处的作用域。因此,eval() 里任何的变量定义、修改,都会在函数结束后被保留。
②assert()
PHP 5
assert ( mixed $assertion [, string $description ] ) : bool
PHP 7
assert ( mixed $assertion [,Throwable $exception ] ) : bool
说明:assert()会检查指定的assertion并在结果为FALSE时采取适当的行动。
Traditional assertions(PHP 5 and 7)
如果assertion是字符串,它将会被assert()当做PHP代码来执行。assertion是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含assertion表达式。这意味着如果你传入了boolean的条件作为assertion,这个条件将不会显示为断言函数的参数;在调用你定义的assert_options()处理函数时,条件会转换为字符串,而布尔值FALSE会被转换成空字符串。
③call_user_func()/call_user_func_array()
(PHP 4,PHP 5, PHP 7)
call_user_func ( callable $callback [,mixed $parameter [, mixed $... ]] ) : mixed
说明:call_user_func 一把第一个参数作为回调函数调用
第一个参数callback是被调用的回调函数,其余参数是回调函数的参数。
可以传递任何内置函数或用户自定义函数,除了语言结构如array(),echo(),empty(),eval(),exit(),isset(),list(),print(),unset()
④create_function()
(PHP 4 >= 4.0.1,PHP 5,PHP 7)
create_function ( string $args , string $code ) : string
说明:create_function()根据传递的参数创建匿名函数,并为其返回唯一的名称
⑤usort()/uasort()
(PHP 4,PHP 5, PHP 7)
usort ( array 6$array , callable $value_compare_func ) : bool
说明:usort()使用用户自定义的比较函数对数组中的值进行排序
本函数将用用户自定义的比较函数对一个数组中的值进行排序。如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
例子:
<?php
function my_sort($a,$b)
{
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}
$a=array(4,2,8,6);
usort($a,"my_sort");
$arrlength=count($a);
for($x=0;$x<$arrlength;$x++)
{
echo $a[$x];
echo "<br>";
}
?>
运行结果:
2
4
6
8
⑥ob_start()
(PHP 4, PHP 5,PHP 7)
ob_start([ callback $output_callback [, int $chunk_size [, bool $erase ]]] ) : bool
说明:ob_start()打开输出控制缓冲
此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容((除http标头外),相反需要输出的内容被存储在内部缓冲区中。
内部缓冲区的内容可以用ob_get_contents()函数复制到一个字符串变量中。想要输出存储在内部缓冲区中的内容,可以使用ob_end_flush()函数。另外,使用ob_end_clean()函数会静默丢弃掉缓冲区的内容。
Warning 当有正在调用的回调函数时,一些网络服务器(例如Apache)会改变一个脚本的工作目录。你可以在
回调函数中再把它改回来,例如chdir(dirname($_SERVER[‘SCRIPT_FILENAME’]))。
输出缓冲区是可堆叠的,这即意谓着,当有一个ob_start()是活跃的时,你可以调用另一个ob_start()。只要确保又正确调用了ob_end_flush()恰当的次数即可。如果有多重输出回调函数是活跃的,输出内容会一直按嵌套的顺序依次通过它们而被过滤。
⑦${php代码}
${}可以将大括号内的PHP代码当作命令进行执行。