全局数组

本文详细分析了BugkuCTF中涉及的全局数组变量问题,包括代码审计、正则表达式解释以及PHP的错误报告级别设置。通过`var_dump()`、`preg_match()`和`error_reporting(0)`等函数的使用,探讨了代码可能存在的安全漏洞。此外,解释了正则表达式`/^w+/i`的含义,并提到了可变变量的概念,强调了如何在函数内部调用全局变量`GLOBALS[]`。最后讨论了通过URL参数传递数组可能带来的安全隐患。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BugkuCTF变量1

正版writeup
题目代码

flag In the variable ! <?php 
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>

代码审计:检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞
对代码进行分析:
第一点:
var_dump():打印变量的相关信息
正则表达函数:preg_match():用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。

语法:    preg_match (pattern , subject, matches);
			pattern:正则;	
			subject:需要匹配检索对象;
			match: 可选,存储匹配结果的数组,

error_reporting(0);// 关闭错误报告
PHP 有诸多错误级别,使用erro_reporting()函数可以设置在脚本运行时的级别。如果没有设置可选参数 level,error_reporting() 仅会返回当前的错误报告级别。
highlight_file() 函数对文件进行语法高亮显示。

语法:highlight_file(filename,return)
   			  filename 	必需。要进行高亮处理的 PHP 文件的路径。
  			  return 	可选。如果设置 true,则本函数返回高亮处理的代码。

第三点

/^\w+ / i 两 个 / / 表 明 正 则 表 达 式 的 开 始 与 结 束 ; 表 示 开 始 字 符 , /i 两个/ / 表明正则表达式的开始与结束; ^ 表示开始字符, /i//结束字符 \w 包含【a-z,A-Z,,0-9】中的字
符,+代表可以有一个,或多个\w 后面的一个i是不区分大小写,其实放在这里没用了,因为\w包含着
大小写 总的加起来意思是 以[a-z,A-Z,
,0-9]中的其中一个字符开始,中间可以有任意个[a-z,A-Z,,0-9]
字符,最后再以[a-z,A-Z,
,0-9]中的一个字符结束 比如适合的有:a,a09,a_01,001 不适合的有a-
5,@12,¥12,中文字符,这些都不在[a-z,A-Z,_,0-9]范围里面
i表示不区分大小写

对writeup:

?args=GLOBALS

可变变量:两个$$一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
全局数组,可以在函数内部调用全局变量,

$GLOBALS[] 包含正在执行脚本所有超级全局变量的引用内容

$GLOBALS[];

最后的[]没有输入的问题:
这里的$args = $_GET[‘args’];将url里 的args=后的值赋给args,如下例

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

假设用户访问的是 http://example.com/?name=Hannes

以上例程的输出类似于:

Hello Hannes!

这里输出的是一串字符,个人想法是作为一段数组,因此,使用GLOBAL[]时,类似C的输入数组名

### C++ 中全局数组的定义、用法及特性 #### 定义 在 C++ 编程语言中,全局数组是指声明在函数外部的数组。这种类型的数组在整个程序运行期间都存在,并具有全局作用域或文件作用域,具体取决于其声明的位置[^1]。 #### 声明与初始化 全局数组可以通过指定类型和大小来声明。例如: ```cpp int globalArray[5]; // 声明一个整型全局数组,大小为5 ``` 如果未显式初始化,则全局数组会被默认初始化为零(对于数值类型),或者为空字符串(对于字符类型)。以下是带有初始值的例子: ```cpp double globalDoubleArray[] = {1.0, 2.0, 3.0}; // 自动推导大小并赋初值 char globalCharArray[7] = "global"; // 字符串初始化 ``` #### 生命周期与存储位置 全局数组通常位于进程的数据段中,这意味着它的生命周期贯穿整个程序执行过程。一旦程序启动,这些数组就被分配内存;当程序结束时才释放该部分资源[^2]。 #### 访问权限 由于全局变量拥有较长的作用范围——即可以从任何地方访问它(只要遵循正确的命名空间规则),因此需要注意避免不必要的依赖关系以及潜在的竞争条件等问题。为了保护数据一致性,在多线程环境下操作共享状态下的全局对象时应采取同步措施。 #### 存储类别说明符 可以结合 `static` 关键字进一步限定局部范围内有效但仍保持持久性的静态全局数组行为模式: ```cpp // 文件级别可见度降低至当前源文件内部独享版本. static int restrictedGlobalArr[10]; ``` 此外还有常量修饰版只读属性实例化方法如下所示: ```cpp const float piValues[]={3.14f}; constexpr size_t dim=3; float matrix[dim][dim]= {{}}; ``` 以上代码片段展示了如何利用 constexpr 来提前计算维度参数从而实现更安全高效的编译期优化选项。 #### 特性和注意事项 - **优点**: 不需要手动管理内存分配与回收; 对于小型固定尺寸集合非常适合因为效率较高且易于理解维护。 - **缺点**: 占用了固定的地址空间即使不总是需要用到全部容量也可能浪费掉一部分宝贵的RAM区域; 可能引发难以追踪调试错误如越界写入破坏临近单元内容等风险增加复杂程度. 综上所述,C++ 提供了灵活的方式来定义和使用全局数组,但在实际项目开发过程中应当谨慎权衡利弊合理选用合适的技术手段达成目标功能需求.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值