1.eval()
这个最简单,把传递上来的字符串当作代码来执行 ,php5 7都能使用,需要注意的是eval是一个语言构造器而不是一个函数,不能被可变函数调用
eval和assert的区别 asseert可以拆分调用 比如
<?php $a='ass'; $b='ert'; $c=$a.$b; $c(phpinfo());
eval不行,eval必须完整调用
<?php
if(isset($_GET['id'])){
eval($_GET['id']);
}else{
echo '请输入参数 id';
}
2.assert()
虽说是在php7上已弃用,会报警告,但是仍然可以使用,实测在php8才正式弃用
<?php
$a=$_GET['id'];
assert($a);
使用方法与eval类似,是一个函数,可当作回调函数使用
3.preg_replace() /e选项
php5会警告,php7正式弃用
这是一个正则表达式,但是有个 /e选项,可以吧替换的字符串当作代码来执行
<?php
$a=$_GET['id'];
echo preg_replace('/test/e',$a,'htllo;test1');
http://127.0.0.1/111/code_exec_2.php?id=phpinfo();
PHP 5.5.0 起, 传入 "\e" 修饰符的时候,会产生一个 E_DEPRECATED 错误; PHP 7.0.0 起,会产生 E_WARNING 错误,同时 "\e" 也无法起效。
4.create_function()
php5 7.0正常,7.2-7.4开始提示弃用 8.0正式弃用
创建一个匿名函数,第一个参数是函数传递的参数,第二个参数当作函数体执行
<?php
$aa='echo eval($a);';
$func=create_function('$a',$aa);
$a=$_GET['id'];
$func($a);
5. array_map()
通过第一个参数的回调函数执行第二个参数数组的内容
php 5 7 8可用
<?php
$a[]=$_GET['id'];
array_map('assert',$a);
6.call_user_func() / call_user_func_array()
(PHP 4, PHP 5, PHP 7, PHP 8)
第一个参数 callback
是被调用的回调函数,其余参数是回调函数的参数。
将第二个参数的内容交给第一个参数执行
<?php
$a=$_GET['id'];
call_user_func('assert',$a);
7.array_filter()
从7.2开始无法使用assert动态执行
将第一个参数交给第二个参数执行
<?php
$a[]=$_GET['id'];
array_filter($a,'assert');