进程环境详解(三)---深入探究环境表

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”));

进程环境详解(三)---深入探究环境表

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()`等函数,以降低进程的权限级别。

– 环境表篡改:攻击者可能会修改环境表中的某些值,从而影响进程的行为。避免此类问题的方法之一是在程序启动时保存环境表,并在运行过程中对其进行验证。

– 环境变量覆盖:攻击者可能会通过设置恶意环境变量来执行代码注入等攻击。避免此类问题的方法之一是使用“只读”或“不可写”等标志位来限制某些敏感变量。

小结

本文主要介绍了进程环境中另一个重要组成部分——环境表。我们讲解了如何访问、修改、添加和删除其中的键值对,并探究了相关安全性问题。