MajjiAnudeep/prompt-injection-demo

GitHub: MajjiAnudeep/prompt-injection-demo

一个演示 AI 集成应用中 Prompt 注入攻击与防御的实战教学项目,通过对比无防护和多层防护的 Bug 工单分类系统帮助理解 LLM 安全问题。

Stars: 0 | Forks: 0

# Prompt 注入演示 这是一个关于 AI 集成应用中 Prompt 注入攻击与防御的实战演示项目,基于 Spring Boot、React 以及通过 Spring AI 集成的 Google Gemini 构建。 ## 什么是 Prompt 注入? 现代应用程序越来越多地使用 AI 模型来自动化决策,例如工单分类、内容审核和数据提取。当用户提供的内容在未经适当安全防护的情况下传递给 AI 模型时,攻击者就有可能通过精心构造的输入来操纵模型的行为。这就是 Prompt 注入。 这不是一个冷门的研究课题。它已被列入 OWASP LLM 应用程序 Top 10 中,并且与任何将 AI 与用户提供的内容相集成的应用程序都息息相关。这个名称是经过深思熟虑的:它在概念上与 SQL 注入属于同一类问题,只不过它针对的是 AI 的指令管道,而不是数据库查询。 ## 应用程序的功能 该应用程序模拟了一个 AI 辅助的 Bug 工单分类系统。Bug 报告通过表单提交,并由 AI 自动分类为相应的严重级别和负责团队。 它包含四个标签页: | 标签页 | 显示内容 | |---|---| | Chat Integration | 带有对话记忆的基础 Spring AI 和 Gemini 聊天集成 | | Vulnerable Triage | 没有任何防护措施的 Bug 工单提交——注入的指令会成功执行 | | Guarded Triage | 经过四层防御加固的相同分类系统 | | Ticket History | 所有已提交的工单,支持过滤、排序和删除 | 有关包含攻击示例、防护栏解释和绕过尝试的完整演练,请参阅[后端 README](./prompt-injection/README.md)。 ## 仓库结构 ``` prompt-injection-demo/ ├── prompt-injection/ # Spring Boot backend — all AI logic, guardrails, and data └── prompt-injection-ui/ # React frontend — visual interface only ``` 后端包含了所有核心逻辑。前端是一个可视化层,使得无需使用 curl 或 Postman 等 API 工具即可进行演示访问。 ## 技术栈 | 层级 | 技术 | |---|---| | 后端 | Java 17, Spring Boot 3, Spring AI | | AI 模型 | Google Gemini | | 数据库 | PostgreSQL | | 前端 | React 18, Vite, Material UI | ## 运行应用程序 有两种运行应用程序的方式:使用 Docker(推荐,前置条件较少)或本地运行。 ### 选项 A — Docker(推荐) **前置条件:** [Docker Desktop](https://www.docker.com/products/docker-desktop)(包含 Docker 和 Docker Compose)。 **步骤 1 — 配置环境** 在根目录下将 `.env.example` 复制为 `.env`: 在 Linux 或 Mac 上: ``` cp .env.example .env ``` 在 Windows 上: ``` copy .env.example .env ``` 打开 `.env` 并填写两个必填值: - `DB_PASSWORD` — 任选一个强密码 - `GEMINI_API_KEY` — 从 [Google AI Studio](https://aistudio.google.com/app/apikey) 获取免费密钥 所有其他值都有安全的默认值,可以保持不变。 **步骤 2 — 启动应用程序** 在根目录下运行: ``` docker compose up --build ``` 这将同时启动 PostgreSQL、后端和前端。首次运行需要几分钟时间来构建镜像。 **步骤 3 — 打开应用** 在浏览器中访问 `http://localhost:3000`。 要停止应用程序,请在终端中按 `Ctrl+C`,然后运行: ``` docker compose down ``` 数据库数据保存在一个命名的 Docker 卷中,并且在重启后仍然存在。要清除所有数据: ``` docker compose down -v ``` ### 选项 B — 本地运行 **前置条件:** **Java 17** ``` java -version ``` 输出应显示版本 17 或更高。如果不是,请从 [adoptium.net](https://adoptium.net) 下载。 **Node.js 18 或更高版本** ``` node --version ``` 如果未安装,请从 [nodejs.org](https://nodejs.org) 下载。 **PostgreSQL** 需要一个正在运行的 PostgreSQL 实例。应用程序将在首次运行时通过 JPA 自动创建其所需的表。您只需要一个现有的数据库以及拥有访问权限的用户。 **Gemini API Key** 从 [Google AI Studio](https://aistudio.google.com/app/apikey) 获取免费的 API 密钥。 **步骤 1 — 启动后端** 导航到后端目录: ``` cd prompt-injection ``` 设置所需的环境变量: 在 Linux 或 Mac 上: ``` export DB_HOST=jdbc:postgresql://localhost:5432/your_database export DB_USERNAME=your_db_user export DB_PASSWORD=your_db_password export GEMINI_API_KEY=your_gemini_api_key ``` 在 Windows 上: ``` set DB_HOST=jdbc:postgresql://localhost:5432/your_database set DB_USERNAME=your_db_user set DB_PASSWORD=your_db_password set GEMINI_API_KEY=your_gemini_api_key ``` 启动应用程序: 在 Linux 或 Mac 上: ``` ./gradlew bootRun ``` 在 Windows 上: ``` gradlew.bat bootRun ``` 后端将在 `http://localhost:8081` 上启动。请等待直到看到 Spring Boot 启动日志,然后再进行下一步。 **步骤 2 — 启动前端** 打开一个新的终端窗口并导航到前端目录: ``` cd prompt-injection-ui ``` 安装依赖项(仅在首次运行或拉取更改后需要): ``` npm install ``` 启动开发服务器: ``` npm run dev ``` 前端将在 `http://localhost:3000` 上启动。 **步骤 3 — 打开应用** 在浏览器中访问 `http://localhost:3000`。在初始屏幕上输入任何名称即可开始。该名称将用作您的会话标识符以及已提交工单的报告人名称。这里没有真正的身份验证。 ## 项目文档 | 文件 | 描述 | |---|---| | [prompt-injection/README.md](./prompt-injection/README.md) | 完整指南,涵盖概念、演示演练、防护栏详细信息和绕过示例 | | [prompt-injection-ui/README.md](./prompt-injection-ui/README.md) | 前端设置与结构 | ## 关于此演示的重要说明 此应用程序是刻意保持极简的。它不包含弹性模式、速率限制、降级策略、API 密钥轮换或可观测性。这些都是生产环境中 AI 集成的标准要求,但为了将重点保持在注入概念上,这里将其省略了。 *旨在用于教育目的。基于 Spring Boot、React 和通过 Spring AI 集成的 Gemini 构建。*
标签:AI安全, API密钥检测, Bug工单, Chatbot, Chat Copilot, CISA项目, DLL 劫持, GitHub Advanced Security, LLM, OWASP Top 10 LLM, React, Spring AI, Spring Boot, Syscall, Syscalls, Unmanaged PE, Web开发, 人工智能, 大语言模型, 安全, 安全加固, 安全教学, 安全防护, 工单分类, 拦截, 提示注入, 测试用例, 漏洞, 漏洞演示, 用户模式Hook绕过, 网络安全, 网络调试, 自动化, 请求拦截, 超时处理, 输入验证, 防御机制, 隐私保护, 集群管理