切换风格

Wizard Sky California Sunset glow Black Cloud Beige Dragon Lavender NewYear City Snow Flowers London
收藏本站XSS平台字符串转换jsfuck
老款webshell中发现的php.ini中allow_call_time_pass_reference参数的意思[复制链接]
发表于 2013-1-26 22:34:17 | 显示全部楼层 |!read_mode!
今天看到一加密的php webshell 准备分析下思路,拿到本地居然有两个 Warning 级别的报错

Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of fsockopen(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in F:\wamp\www\[url]www.cao.com[/url]\shell.php(2) : eval()'d code(1) : eval()'d code on line 1315


很是好奇,后发现居然是使用引用不当导致,

从php手册中可以找到:
allow_call_time_pass_reference boolean
是否启用在函数调用时强制参数被按照引用传递。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告,参数会被按值传递而不是按照引用传递)。

在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。

当allow_call_time_pass_reference=Off时

<?php
function abc($a,$b){
    echo "$a\n";
    echo "$b\n";
    $b = 'cde';
}

$a = 'abc';
$b = "bcd";

//不好的用法,会引发一个php warnning
abc($a ,&$b);

echo "$b\n";
?>


要想通过引用来传递参数$b,程序可改为

<?php
function abc($a,& $b){
    echo "$a\n";
    echo "$b\n";
    $b = 'cde';
}

$a = 'abc';
$b = "bcd";
//正确的用法
abc($a ,$b);

echo "$b\n";
//output is:
//abc
//bcd
//cde
?>




操千曲而后晓声,观千剑而后识器。
发表于 2013-1-27 22:24:21 | 显示全部楼层
本帖最后由 蜀山野鬼 于 2013-1-27 22:26 编辑

这个问题 是否可以这样来理解呢 如果 allow_call_time_pass_reference=Off  
正常使用引用的时候
function abc($a,&$b){
       //
}

abc($a,$b);//这里实际是传递$b的地址  

若是这样来写

function abc($a,$b){
  //
}

abc($a,&$b);
当定义abc函数a  b 都是的时候  其形参动态的  函数执行结束之后就释放  如果这样来调用abc($a,&$b); 形参中的$b引用实参中$b的内容  在函数执行完毕后会释放 引用就失效了



发表于 2013-1-27 23:35:06 | 显示全部楼层
蜀山野鬼 发表于 2013-1-27 22:24
这个问题 是否可以这样来理解呢 如果 allow_call_time_pass_reference=Off  
正常使用引用的时候
functio ...

我想 是的

代码区

GMT+8, 2019-11-19 21:51

Powered by Discuz! X2

© 2001-2018 Comsenz Inc.

回顶部