使用Nginx对静态资源鉴权

需求问题

公司渗透测试扫描发现了一个未授权访问文件的问题,即外网可以通过文件地址直接访问文件服务器中文件,无需任何认证,造成公司敏感数据泄露。

问题分析

当前获取文件的流程如下

我们的文件地址形如:http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc(x.x.x.x是应用服务器IP)
1)请求地址到应用服务器。
2)应用服务器再通过nginx转发到文件服务器(y.y.y.y),获取到对应文件。
3)获取到文件后直接返回,如果是返回前端,即可做图片预览,文件下载,视频播放等功能。此外中台应用功能,如发送邮件时,也是直接调用的文件地址获取附件。
该地址是在应用服务器通过nginx直接转发到文件服务器的,没有经过应用系统鉴权,好处就是获取文件无需暂用应用服务器带宽,速度较快。但也产生了未授权访问的问题。
在这里插入图片描述

解决方案

方案1

应用服务器增加接口,所有文件都从该接口转发到文件服务器获取,并以文件流的方式返回。该方式需占用大量带宽,且前后台所有请求文件服务器的代码都需调整,后考虑使用方案二。

方案2

方案2是基于该篇文章(https://www.cnblogs.com/JQ04/p/15905762.html)调整的。
1)请求的文件地址保持不变,先跳转至应用服务器的nginx
2)转换请求路径。因为后续要请求后端进行鉴权,而http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc的请求方式不满足后端接口形式,因此跳转前将该请求转换成了get请求入参的方式:http://x.x.x.x:5001/filefolder?addr=/folder1/folder2/aaa.doc。
3)应用服务器nginx再路由至应用做鉴权,鉴权通过后重定向会nginx服务器配置的静态资源路径。
4)再由应用服务器跳转至文件服务器获取文件。
流程如下:
在这里插入图片描述

具体实现

应用服务器nginx配置
server{
	listen 5001;
	# 文件路径前缀
	location /filefolder{
	    # 此步骤是经文件路径转换成get请求带入参的格式。
		proxy_pass http:x.x.x.x:5001/ftpFile?addr=;
	}
	# 鉴权前缀
	location /ftpFile{
		 proxy_redirect off;            
		 proxy_set_header Host  $host;            
		 proxy_set_header X-Real-IP $remote_addr;            
		 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
		 # 指定提供文件鉴权服务的地址
		 proxy_pass http://x.x.x.x:5002/servername/ftpFile; 
	}
	# 静态资源前缀
	location /filefolder_static/{
		internal;
		proxy_pass http://y.y.y.y:5123/filefolder/;  #代理的静态文件目录
	}
}
中台鉴权

中台鉴权代码参考文章:https://www.cnblogs.com/JQ04/p/15905762.html
与该文章不同点:
1)前端请求文件地址时,带有cookie,通过cookie进行鉴权
2)中台请求文件地址时,无cookie,因此在鉴权接口上增加了authkey字段,要求中台传文件地址时制定传一个key。中台请求格式如下:

    http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc&authKey=xxxxxxxx

该路径经过nginx转换参数变为

    http://x.x.x.x:5001/filefolder?addr=folder1/folder2/aaa.doc&authKey=xxxxxxxx

在鉴权接口中判断authKey正确后,即为鉴权通过。

### Trae 在安卓开发中的应用 Trae 是一款由字节跳动推出的人工智能驱动集成开发环境 (IDE),它通过智能代码补全、多模态交互以及对整个代码库的上下文分析等功能,显著提升了开发者的工作效率[^2]。对于安卓开发而言,Trae 可以帮助开发者快速生成高质量的 Java 和 Kotlin 代码片段,并提供实时错误检测和优化建议。 以下是关于如何在安卓开发中使用 Trae 的一些具体方法: #### 功能概述 1. **智能代码补全** Trae 能够基于当前项目结构和已有的代码逻辑,预测并自动生成可能的下一行代码或函数实现。这种功能特别适用于复杂的安卓框架操作,比如设置 RecyclerView Adapter 或处理 Activity 生命周期事件。 2. **多模态交互支持** 用户可以通过自然语言描述需求,例如 “创建一个带有两个按钮的布局”,Trae 将解析该请求并生成相应的 XML 文件或者对应的编程接口调用。 3. **精准修改建议** 当遇到性能瓶颈或其他技术难题时,Trae 不仅能指出潜在问题所在位置,还能给出具体的解决方案甚至直接完成修复工作。 #### 示例代码展示 假设我们需要构建一个简单的 Android 应用程序界面,其中包含一个 TextView 显示欢迎消息以及一个 Button 来触发某些动作,则可以借助 Trae 自动生成如下部分核心组件定义: ```xml <!-- res/layout/activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcomeText" android:text="Welcome to My App!" android:gravity="center_horizontal" android:paddingTop="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/actionButton" android:text="Click Me" android:onClick="performAction" android:layout_gravity="center_horizontal" android:layout_marginTop="50dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> ``` 与此同时,在 MainActivity.kt 中关联上述 UI 控件及其行为也可以利用 Trae 提供的功能轻松达成目标: ```kotlin // src/MainActivity.kt package com.example.myapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextView import android.widget.Toast class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val welcomeMessage = findViewById<TextView>(R.id.welcomeText) val actionBtn = findViewById<Button>(R.id.actionButton) actionBtn.setOnClickListener { _ -> Toast.makeText(this@MainActivity, "You clicked the button!", Toast.LENGTH_SHORT).show() welcomeMessage.text = getString(R.string.new_message_text) // Assuming string resource exists. } } } ``` 以上两段代码分别展示了如何运用 Trae 创建基础视图层次结构与绑定基本控件点击监听器的过程。 #### 注意事项 尽管 Trae 非常强大,但在实际编码过程中仍需注意以下几点: - 确保输入给 AI 的指令清晰明了; - 对于特定领域知识密集型任务(如复杂算法设计),应适当补充背景资料以便获得更加精确的结果; - 始终审查最终产出物的质量,因为任何自动化工具都无法完全替代人类专家的经验判断力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值