进程环境详解(三)---深入探究环境表
1、什么是环境表2、如何访问环境表3、如何修改/添加/删除键值对4、修改5、添加6、删除7、环境表与安全性8、小结什么是环境表在前两篇文章中,系统路径、用户自定义变量、运行时参数等等。
什么是环境表
在前两篇文章中,我们已经介绍了进程和进程的环境变量。在这篇文章中,我们将深入探究进程的另一个重要组成部分——环境表。
简单来说,环境表就是一组键值对,用于存储进程运行时所需的各种信息。这些信息包括但不限于:系统路径、用户自定义变量、运行时参数等等。
如何访问环境表
在Linux系统中,我们可以通过`environ`指针来访问当前进程的环境表。具体实现方式为:
“`c
extern char **environ;
“`
其中`environ`是一个指向字符指针数组的全局变量,在程序启动时被初始化。每个元素都指向一个形如“key=value”的字符串。
下面是一个简单的示例代码:
#include
int main(int argc, char *argv[], char *envp[]) {
for (int i = 0; envp[i] != NULL; i++) {
printf(“%sn”, envp[i]);
}
return 0;
}
该程序会遍历当前进程的所有键值对,并输出它们到标准输出流中。
如何修改/添加/删除键值对
虽然环境表在程序启动时被初始化,但我们仍然可以在运行时修改/添加/删除其中的键值对。
修改
要修改一个已有的键值对,我们只需要使用`putenv()`函数即可。具体实现方式为:
int putenv(char *string);
其中`string`是一个形如“key=value”的字符串。如果该键不存在,则会自动创建它。
#include
printf(“before: %sn”, getenv(“MY_VAR”));
![进程环境详解(三)—深入探究环境表缩略图 进程环境详解(三)---深入探究环境表](https://www.72715.net/wp-content/uploads/2023/05/4e299095dcb397198f0d9120ee71ba70.png)
putenv(“MY_VAR=hello”);
printf(“after: %sn”, getenv(“MY_VAR”));
该程序会输出当前进程中名为“MY_VAR”的变量的值,并将其修改为“hello”。
添加
要添加一个新的键值对,我们可以使用类似于修改操作中的方法。具体实现方式为:
int setenv(const char *name, const char *value, int overwrite);
其中`name`表示要创建/更新的变量名;`value`表示要设置给该变量的值;而`overwrite`则表示是否覆盖已有变量(如果该变量已经存在)。
下面是一个简单示例代码:
setenv(“NEW_VAR”, “world”, 1);
printf(“%sn”, getenv(“NEW_VAR”));
该程序会输出一个名为“NEW_VAR”的变量的值,如果该变量不存在则会自动创建它。
删除
要删除一个已有的键值对,我们可以使用`unsetenv()`函数。具体实现方式为:
int unsetenv(const char *name);
其中`name`表示要删除的变量名。
setenv(“TO_BE_DELETED”, “value”, 1);
printf(“%sn”, getenv(“TO_BE_DELETED”));
unsetenv(“TO_BE_DELETED”);
该程序会输出一个名为“TO_BE_DELETED”的变量的初始值,并在之后将其删除。最终再次尝试获取该变量时,应当返回空指针。
环境表与安全性
由于环境表中存储了大量敏感信息(如密码、密钥等),因此在实际开发过程中应当注意保护其安全性。以下是一些常见问题及其解决方法:
– 环境表泄露:由于某些不可预知原因(如内存错误、攻击等),进程可能会将环境表中的信息泄露给攻击者。避免此类问题的方法之一是使用`setuid()`或`setgid()`等函数,以降低进程的权限级别。
– 环境表篡改:攻击者可能会修改环境表中的某些值,从而影响进程的行为。避免此类问题的方法之一是在程序启动时保存环境表,并在运行过程中对其进行验证。
– 环境变量覆盖:攻击者可能会通过设置恶意环境变量来执行代码注入等攻击。避免此类问题的方法之一是使用“只读”或“不可写”等标志位来限制某些敏感变量。
小结
本文主要介绍了进程环境中另一个重要组成部分——环境表。我们讲解了如何访问、修改、添加和删除其中的键值对,并探究了相关安全性问题。