1.相关函数
eval()
eval函数能够将字符串当作命令去执行
需要被执行的字符串
代码不能包含打开/关闭 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() 里任何的变量定义、修改,都会在函数结束后被保留。
返回值
eval() 返回 NULL,除非在执行的代码中 return 了一个值,函数返回传递给 return 的值。 PHP 7 开始,执行的代码里如果有一个 parse error,eval() 会抛出 ParseError 异常。在 PHP 7 之前,如果在执行的代码中有 parse error,eval() 返回 FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获 eval() 中的解析错误。
例如
<?php
highlight_file(__FILE__);
$b='phpinfo()';
$a='phpinfo();';
eval($b);
eval($a);
//eval用来将字符串当作命令执行
?>
在php7的版本以下,eval($b)出现parse error ,但后面的代码依然执行.如果把版本切换至php7就会直接出错,后面代码不会执行
assert()
bool assert( mixed $assertion[, string $description] )
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
测试:
<?php
error_reporting(E_ALL);
highlight_file(__FILE__);
#$a='echo 12345;';
#assert($a);
#assert('echo "456";');
$a=(array)base64_decode($_POST['a']);
array_map(assert,$a);
echo '123';
?>
构造post a=ZXZhbCgncGhwaW5mbygpOycp
执行成功
call_user_func(
call_user_func( callable $callback[, mixed $parameter[, mixed $…]] )
call_user_func — 把第一个参数作