eval与php
1. 求php中eval()函数的使用方法
eval()
函数把字符串按照
PHP
代码来计算。
该字符串必须是合法的
PHP
代码,且必须以分号结尾。
如果没有在代码字符串中调用
return
语句,则返回
NULL。如果代码中存在解析错误,则
eval()
函数返回
false。
例子:
<?php
$string
=
"beautiful";
$time
=
"winter";
$str
=
'This
is
a
$string
$time
morning!';
echo
$str.
"<br
/>";
eval("\$str
=
\"$str\";");
echo
$str;
?>
输出:
This
is
a
$string
$time
morning!
This
is
a
beautiful
winter
morning!
2. php eval怎样执行系统命令
eval — 把字符串作为PHP代码执行
说明
mixedeval( string $code_str )
把字符串code_str作为PHP代码执行。 除了其他,该函数能够执行储存于数据库文本字段内的PHP代码。
使用eval()时需注意几个因素:注意字符必须是有效的PHP代码,包括结尾的分号,以不至于解释器在eval()之后退出。并且正确地转义code_str中的东西。你可以使用一个PHP闭合标签来混合输出HTML和PHP代码。
同时需注意eval中的变量会被保留在之后的主脚本中。
参数
code_str需要被执行的字符串code_str不能包含 PHP Opening tags。
return语句会立即中止当前字符串的执行。
返回值
eval()返回NULL,除非在执行的代码中return了一个值,函数返回该值。 如果在执行的代码中有一个解析错误,eval()返回FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获eval()中的解析错误。
范例
Example #1eval()例子 - 简单的文本合并
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
以上例程会输出:
This is a $string with my $name in it.This is a cup with my coffee in it.
Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
Tip和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。
Note:
如果在执行的代码中产生了一个致命的错误(fatal error),整个脚本会退出。
Linux 中
shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
例如
$:cat ext
count=3
cmd=echo
cmd="$cmd \$$count"
ext 11 22 33
此时cmd=" echo $3"
eval $cmd 等价于 "echo 33 "
3. PHP中的常见风险函数
PHP风险函数代码执行
在PHP中,eval()函数能将字符串作为PHP代码执行,但其非标准函数且易被滥用,存在安全风险。进阶使用时,可以执行多条命令,如eval()嵌套eval()。特殊输入如结束命令?>或使用ascii码或base64编码绕过过滤机制,实现潜在攻击。
验证函数assert()
assert()函数同样执行字符串作为PHP代码,但其为标准函数且需配合;使用。高版本PHP弃用assert(),建议使用其他替代方法进行代码验证。
正则替换函数preg_replace()
preg_replace()用于正则匹配后替换字符串,但非风险函数。通过回调函数扩展其功能,实现更灵活的替换逻辑。
回调函数call_user_func()
call_user_func()调用其他函数,实现动态调用,如assert(phpinfo())。进阶使用时需考虑参数和函数名的传递。
动态函数array_map()和动态函数
array_map()动态调用函数处理数组元素,动态函数允许完全自定义函数名和参数,增强代码灵活性。
命令执行系统函数system()和exec()
system()执行系统命令,识别空格且输出功能强大。exec()用于执行命令并捕获输出,但仅支持一行,且存在中文乱码问题。
shell_exec()和passthru()执行命令
shell_exec()和passthru()分别用于执行命令并捕获输出,passthru()自动输出,shell_exec()则需要手动捕获,两者均识别空格。
popen()执行命令并捕获多行输出
popen()执行命令且支持多行输出,但只能输出一行,非自动输出。通过这些函数执行系统命令时需谨慎,以避免潜在的安全风险。