标签:PHP 函数 str 代码 assert 漏洞 代码执行 eval php
产生原因
因为对用户可控参数过滤不严,导致通过相关函数将php代码注入到Web应用中通过Web容器执行。
相关函数
PHP:eval()、assert()、call_user_func_array()、preg_replace()、call_user_func()等常规函数和动态函数$a($b) (比如$_GET($_POST["xxx"])
其中eval()和assert()区别
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\";");#等同于:$str = "$str";而双引号中的代码会优先执行并替换
echo $str;
?>
值得注意的是:
1.eval函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号(这个分号是php限制)。
2.注意单引号,双引号和反斜杠的运用。如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号前一定要有\来转义,如果没有赋值操作可以不需要。
assert:
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特定点该的表达式值为真(为真才能继续执行)。如果该表达式为假,就中断操作.
assert ( mixed $assertion [, Throwable $exception ] )
漏洞:如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval(),和eval()函数区别在于参数不需要分号;结尾
eval(" phpinfo()"); <错误>
eval(" phpinfo();"); <正确>
assert(" phpinfo()"); <正确>
其他函数
preg_replace(),call_user_func(),动态函数,以及双引号引起的对内容的二次解释引发的代码执行漏洞。
参考https://blog.csdn.net/qq_45521281/article/details/106162786
标签:PHP,函数,str,代码,assert,漏洞,代码执行,eval,php 来源: https://www.cnblogs.com/lulu-3214536072/p/15388389.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。