对php中在foreach中使用foreach ($arr as &$value) 这种类型的解释

162 篇文章 0 订阅
114 篇文章 0 订阅

自 PHP 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

<?php
$arr 
= array(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr is now array(2, 4, 6, 8)
?>
此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。
<?php
foreach (array(1234) as &$value) {
    
$value $value 2;
}

?>
原文的详细解释在这个路径:http://cn2.php.net/manual/zh/control-structures.foreach.php
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道 CTF 题目是一个 PHP 代码审计题目,需要我们构造一个可以绕过代码的一些限制,获取 flag 的 payload。让我们逐步分析代码。 首先,代码调用了 `error_reporting(0)` 函数,这意味着错误信息将不会被显示。接着,调用了 `highlight_file(FILE)` 函数,这会将代码文件以 HTML 形式显示在页面上。这些都没有什么用处,我们需要关注 `if` 语句后面的代码块。 ``` if (isset($_GET['debug'])) { // disable function phpinfo(); exit; } ``` 这里,如果我们在 URL 传递了 `debug` 参数,代码将会调用 `phpinfo()` 函数并退出,这意味着我们无法继续执行后面的代码并获取 flag。因此,我们需要构造一个 payload,使得 `debug` 参数不会被触发。 接下来,我们看到了一个 `count_string_char()` 函数,它接受一个字符串作为参数,并返回字符串不同字符的数量,这个函数似乎没有什么用处,但是在后面的代码被调用了。 ``` function count_string_char($str) { $arr = []; foreach (str_split($str) as $value) { if (!in_array($value, $arr)) { array_push($arr, $value); } } return sizeof($arr); } ``` 最后,我们看到了一个用于接收 POST 请求的代码块: ``` if (isset($_POST['cmd']) && count_string_char($_POST['cmd']) <= 13 && !preg_match('/[^\w\s]/', $_POST['cmd'])) { echo "Output: "; eval($_POST['cmd']); } ``` 这段代码首先检查了是否存在 POST 请求,并且传递的 `cmd` 参数长度不大于 13,并且不包含除 `$` 和 `_` 以外的字符。如果条件都满足,代码将会执行 `eval($_POST['cmd'])` 来执行我们传递的命令。这就是我们绕过 `debug` 参数的机会,我们需要构造一个可以在这里执行的有效负载来获取 flag。 因此,我们可以构造以下有效负载: ``` $_POST['cmd'] = '$flag=file_get_contents("flag.php");echo $flag;'; ``` 这条语句将会读取 `flag.php` 文件的内容并输出到页面上。将这条语句作为 `cmd` 参数发送给服务器,即可成功获取 flag。 注意:由于 `eval()` 函数的不安全性,不建议在实际开发使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值