news 2026/6/20 11:06:25

Agent 如何写入数据库才安全:事务、参数化、审计与回滚策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Agent 如何写入数据库才安全:事务、参数化、审计与回滚策略

Agent 如何写入数据库才安全:事务、参数化、审计与回滚策略

引言

痛点引入:从3个真实的Agent安全事故讲起

作为一名写过近10年后端API、最近3年深耕AI Agent落地的工程师,我见过太多因为**Agent数据库交互逻辑写得太「野」**而导致的灾难。这些事故轻则让团队加3天班抢救数据,重则让公司面临监管罚款甚至用户信任崩塌:

第一个事故是我朋友小A创业时踩的坑:他们做了一个面向中小企业的「AI财务报销助手」,Agent可以直接读取员工上传的发票、机票、打车单,提取金额、时间、报销人等字段,自动生成报销单并写入公司内网的PostgreSQL数据库。结果上线第7天,一个财务人员上传了一张包含DELETE FROM expense_records WHERE 1=1; --的恶意图片(OCR识别误把注释内容当成了字段备注),Agent直接拼接字符串执行SQL,删除了所有427条已经审核通过的报销记录。最后虽然通过全量备份恢复了数据,但还是损失了2小时的实时业务数据,小A公司的投资人差点撤资。

第二个事故是我前公司的运维同学排查到的:我们内部的「AI代码生成+部署助手」Agent会在生成完Docker Compose文件后,自动更新部署服务器的IP地址、数据库密码等配置信息到MySQL元数据库。结果某次部署测试环境时,Agent的代码逻辑有个低级bug:先更新了测试环境的密码,再更新配置信息,但中间网络突然中断了。等网络恢复后,测试环境的配置表里IP和密码不匹配,整个测试环境的27个微服务全部挂掉,QA团队停工了整整1天半。

第三个事故更离谱,差点让我前公司收到GDPR的罚款:我们面向欧洲客户的「AI客服记录分析助手」会把客服对话中提取的敏感信息(比如用户的姓名、邮箱、住址)经过「脱敏」处理后,写入MongoDB的分析库。结果开发Agent的实习生为了图省事,把「脱敏」逻辑写在了前端提示词里,而不是数据库写入的核心代码里——某一天实习生改了提示词,不小心删掉了「姓名全脱敏、邮箱前3位后2位保留、住址只保留城市」的要求,结果连续3天写入了12000+条完全没脱敏的用户敏感数据。还好我们的审计系统是独立部署的,每天凌晨会扫描分析库的所有字段,发现后立刻停止了分析任务,手动清理了敏感数据,才没酿成大祸。

看完这3个事故,你是不是后背发凉?是啊,现在AI Agent越来越普及,从简单的文档问答到复杂的业务流程自动化,很多Agent都需要和数据库打交道——要么读取业务数据辅助决策,要么把生成的结果、提取的信息、更新的配置写入数据库。但大多数开发Agent的同学要么是前端转AI,要么是算法转工程,对数据库安全交互的基本常识不太重视,或者只知道「参数化查询」这一招,但不知道怎么和事务、审计、回滚策略结合起来,形成一个完整的安全防线。

解决方案概述:构建Agent数据库交互的4层安全堡垒

今天这篇文章,我就带你系统地解决这个问题——我们要为Agent构建一个**从「写入前」到「写入中」再到「写入后」**的4层安全堡垒:

  1. 第1层堡垒:写入前的「白名单校验+数据预处理」——先把恶意数据、格式错误的数据挡在门外,从源头上减少风险;
  2. 第2层堡垒:写入中的「参数化查询+最小权限角色+ACID事务」——这是核心防线,既能防止SQL注入,又能保证数据的一致性和完整性;
  3. 第3层堡垒:写入后的「全链路审计日志+自动敏感数据检测」——万一前两层堡垒被突破了,我们也能通过审计日志快速定位问题,通过自动检测及时发现敏感数据泄露;
  4. 第4层堡垒:极端情况下的「多级回滚策略+数据备份恢复预案」——如果真的出了大问题,我们也能快速回滚到正常状态,把损失降到最低。

为了让你真正理解并掌握这些策略,我不仅会讲清楚每个策略的核心概念、原理、数学模型(如果有的话)、边界与外延,还会结合一个真实的AI Agent项目——「AI智能订单处理助手」,带你从零开始实现这4层安全堡垒。这个项目会用到Python(Agent开发用LangChain)、PostgreSQL(关系型业务数据库)、MongoDB(非关系型审计/分析数据库)、Redis(缓存和分布式锁)这些常用的技术栈,你可以直接把代码复制到你的项目里用。

最终效果展示

在正式开始之前,我们先来看一下这个「AI智能订单处理助手」的核心功能安全防护效果

核心功能
  1. 读取用户输入的订单信息:可以是自然语言(比如「帮我给张三的淘宝店下单买10件苹果,单价5块钱,地址是北京市朝阳区望京SOHO T3 1201室」),也可以是Excel/CSV文件;
  2. 提取并校验订单字段:自动提取订单编号、商品名称、商品数量、商品单价、总金额、客户姓名、客户电话、收货地址、下单时间这些字段,并校验字段的格式和合理性(比如总金额必须等于商品数量×商品单价,下单时间不能晚于当前时间);
  3. 写入关系型业务数据库:把校验通过的订单信息写入PostgreSQL的orders表和order_items表(因为一个订单可能包含多个商品);
  4. 生成物流单号并更新:调用第三方物流API生成物流单号,然后更新到orders表;
  5. 记录全链路审计日志:把Agent的每一步操作(比如读取用户输入、提取字段、校验字段、写入数据库、生成物流单号、更新数据库)都记录到MongoDB的agent_audit_logs表;
  6. 自动回滚极端情况:如果写入order_items表失败、或者生成物流单号失败、或者更新orders表失败,就自动回滚所有已经写入/更新的业务数据。
安全防护效果
  1. 防SQL注入测试:我们给Agent输入一条恶意的自然语言(比如「帮我给’ OR ‘1’='1的淘宝店下单买10件苹果」),Agent不会执行恶意SQL,只会提示「客户姓名包含非法字符,请重新输入」;
  2. 数据一致性测试:我们模拟「写入orders表成功,但写入order_items表失败」的情况,Agent会自动回滚orders表的写入操作,不会留下脏数据;
  3. 敏感数据检测测试:我们给Agent输入一条包含用户身份证号的自然语言(比如「帮我给身份证号是110105199001011234的张三下单」),Agent的审计系统会自动在日志里标记「发现敏感数据:身份证号」,并且不会把身份证号写入业务数据库;
  4. 权限最小化测试:我们给Agent使用的数据库角色只有orders表和order_items表的INSERTUPDATE权限,没有DELETEDROPALTER权限——就算前两层堡垒被突破了,Agent也无法删除或修改表结构。

好,接下来我们就正式开始!


第0章:准备工作——磨刀不误砍柴工

在讲具体的安全策略之前,我们先把开发环境、项目结构、基础知识这些准备工作做好。

0.1 环境/工具

0.1.1 软件版本要求

为了保证代码的可运行性,我建议你使用以下软件版本(当然,其他兼容的版本也可以,但最好先试试这些版本):

  • 操作系统:Windows 10/11、macOS Ventura/Sonoma、Ubuntu 22.04 LTS(推荐Linux,因为生产环境一般用Linux);
  • Python:3.10.x或3.11.x(LangChain v0.1.x对这两个版本的支持最好);
  • PostgreSQL:15.x或16.x(支持JSONB、事务、触发器这些功能,适合做关系型业务数据库);
  • MongoDB:6.x或7.x(支持BSON、全文索引、时间序列集合这些功能,适合做非关系型审计/分析数据库);
  • Redis:7.x(支持分布式锁、缓存、消息队列这些功能,后面的项目会用到分布式锁);
  • Docker:24.x或25.x(如果你不想手动安装PostgreSQL、MongoDB、Redis,可以用Docker一键启动);
  • Git:2.40.x或更高版本(用来拉取代码);
  • IDE/编辑器:PyCharm Professional(推荐,支持LangChain的插件)、VS Code(需要安装Python、LangChain、PostgreSQL、MongoDB的插件)。
0.1.2 Docker一键启动开发环境

如果你用Docker的话,可以直接用我写的docker-compose.yml文件一键启动PostgreSQL、MongoDB、Redis:

version:'3.8'services:postgres:image:postgres:16-alpinecontainer_name:agent-db-security-postgresrestart:alwaysenvironment:POSTGRES_USER:adminPOSTGRES_PASSWORD:admin123456POSTGRES_DB:agent_orders_dbports:-"5432:5432"volumes:-postgres_data:/var/lib/postgresql/data-./init/postgres:/docker-entrypoint-initdb.d# 初始化PostgreSQL的脚本放在这里mongodb:image:mongo:7-jammycontainer_name:agent-db-security-mongodbrestart:alwaysenvironment:MONGO_INITDB_ROOT_USERNAME:adminMONGO_INITDB_ROOT_PASSWORD:admin123456MONGO_INITDB_DATABASE:agent_audit_dbports:-"27017:27017"volumes:-mongo_data:/data/db-./init/mongo:/docker-entrypoint-initdb.d# 初始化MongoDB的脚本放在这里redis:image:redis:7-alpinecontainer_name:agent-db-security-redisrestart:alwayscommand:redis-server--requirepass admin123456# 给Redis设置密码ports:-"6379:6379"volumes:-redis_data:/datavolumes:postgres_data:mongo_data:redis_data:

把这个文件保存为docker-compose.yml,然后在终端里执行docker-compose up -d,等待几分钟,开发环境就启动好了!

0.1.3 初始化PostgreSQL数据库

我们需要在PostgreSQL里创建两个表:orders表(存储订单的基本信息)和order_items表(存储订单的商品明细),还要创建一个最小权限的数据库角色给Agent使用。

首先,在终端里执行docker exec -it agent-db-security-postgres psql -U admin -d agent_orders_db,进入PostgreSQL的命令行终端,然后执行以下SQL脚本:

-- 1. 创建最小权限的数据库角色:agent_orders_writer-- 这个角色只有 orders 表和 order_items 表的 INSERT、UPDATE、SELECT 权限,没有 DELETE、DROP、ALTER 权限CREATEROLE agent_orders_writerWITHLOGIN PASSWORD'agent_writer_secure_123456';-- 2. 创建 orders 表CREATETABLEIFNOTEXISTSorders(order_idVARCHAR(32)PRIMARYKEY,-- 订单编号,由Agent生成(格式:YYYYMMDDHHMMSS + 6位随机数)customer_nameVARCHAR(100)NOTNULL,-- 客户姓名customer_phoneVARCHAR(20)NOTNULL,-- 客户电话shipping_addressTEXTNOTNULL,-- 收货地址total_amountNUMERIC(10,2)NOTNULLCHECK(total_amount>0),-- 总金额,必须大于0order_statusVARCHAR(20)NOTNULLDEFAULT'pending',-- 订单状态:pending(待处理)、paid(已支付)、shipped(已发货)、completed(已完成)、cancelled(已取消)logistics_noVARCHAR(50),-- 物流单号created_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,-- 创建时间updated_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,-- 更新时间-- 给订单状态、创建时间、更新时间加索引,提高查询效率CONSTRAINTchk_order_statusCHECK(order_statusIN('pending','paid','shipped','completed','cancelled')));-- 3. 创建 order_items 表CREATETABLEIFNOTEXISTSorder_items(item_idSERIALPRIMARYKEY,-- 商品明细ID,自增order_idVARCHAR(32)NOTNULLREFERENCESorders(order_id)ONDELETECASCADE,-- 订单编号,外键关联 orders 表product_nameVARCHAR(200)NOTNULL,-- 商品名称product_quantityINTNOTNULLCHECK(product_quantity>0),-- 商品数量,必须大于0product_unit_priceNUMERIC(10,2)NOTNULLCHECK(product_unit_price>0),-- 商品单价,必须大于0item_total_amountNUMERIC(10,2)NOTNULLCHECK(item_total_amount=product_quantity*product_unit_price),-- 商品明细总金额,必须等于数量×单价created_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,-- 创建时间updated_atTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP-- 更新时间);-- 4. 创建更新时间的触发器函数(自动更新 updated_at 字段)CREATEORREPLACEFUNCTIONupdate_updated_at_column()RETURNSTRIGGERAS$$BEGINNEW.updated_at=CURRENT_TIMESTAMP;RETURNNEW;END;$$LANGUAGEplpgsql;-- 5. 给 orders 表和 order_items 表添加更新时间的触发器CREATETRIGGERupdate_orders_updated_at BEFOREUPDATEONordersFOR EACH ROWEXECUTEFUNCTIONupdate_updated_at_column();CREATETRIGGERupdate_order_items_updated_at BEFOREUPDATEONorder_itemsFOR EACH ROWEXECUTEFUNCTIONupdate_updated_at_column();-- 6. 给 agent_orders_writer 角色赋予权限GRANTCONNECTONDATABASEagent_orders_dbTOagent_orders_writer;GRANTUSAGEONSCHEMApublicTOagent_orders_writer;GRANTSELECT,INSERT,UPDATEONordersTOagent_orders_writer;GRANTSELECT,INSERT,UPDATEONorder_itemsTOagent_orders_writer;GRANTUSAGE,SELECTONSEQUENCE order_items_item_id_seqTOagent_orders_writer;-- 因为 order_items 表的 item_id 是自增的,所以需要赋予序列的权限-- 7. 测试一下 agent_orders_writer 角色的权限(可选)-- 先退出 admin 账号:\q-- 再用 agent_orders_writer 账号登录:docker exec -it agent-db-security-postgres psql -U agent_orders_writer -d agent_orders_db-- 尝试删除 orders 表的一条数据:DELETE FROM orders WHERE 1=1;-- 应该会报错:permission denied for table orders

把这些SQL脚本保存为init/postgres/init.sql,这样Docker启动PostgreSQL的时候就会自动执行这些脚本了(不用手动登录PostgreSQL执行)。

0.1.4 初始化MongoDB数据库

我们需要在MongoDB里创建两个集合:agent_audit_logs(存储Agent的全链路审计日志)和agent_sensitive_data_alerts(存储自动检测到的敏感数据告警),还要给这两个集合加索引,提高查询效率。

首先,在终端里执行docker exec -it agent-db-security-mongodb mongosh -u admin -p admin123456 --authenticationDatabase admin,进入MongoDB的命令行终端,然后执行以下JavaScript脚本:

// 1. 切换到 agent_audit_db 数据库use agent_audit_db;// 2. 创建 agent_audit_logs 集合(时间序列集合,适合存储审计日志)db.createCollection("agent_audit_logs",{timeseries:{timeField:"timestamp",// 时间字段metaField:"metadata",// 元数据字段(比如Agent ID、用户ID、会话ID)granularity:"seconds"// 时间粒度:秒}});// 3. 给 agent_audit_logs 集合加索引db.agent_audit_logs.createIndex({"metadata.agent_id":1});// Agent ID 索引db.agent_audit_logs.createIndex({"metadata.user_id":1});// 用户 ID 索引db.agent_audit_logs.createIndex({"metadata.session_id":1});// 会话 ID 索引db.agent_audit_logs.createIndex({"operation_type":1});// 操作类型索引db.agent_audit_logs.createIndex({"status":1});// 状态索引(success/failure)db.agent_audit_logs.createIndex({"timestamp":-1});// 时间倒序索引(方便查询最近的日志)// 4. 创建 agent_sensitive_data_alerts 集合db.createCollection("agent_sensitive_data_alerts");// 5. 给 agent_sensitive_data_alerts 集合加索引db.agent_sensitive_data_alerts.createIndex({"metadata.agent_id":1});db.agent_sensitive_data_alerts.createIndex({"metadata.user_id":1});db.agent_sensitive_data_alerts.createIndex({"metadata.session_id":1});db.agent_sensitive_data_alerts.createIndex({"alert_level":1});// 告警级别索引(low/medium/high/critical)db.agent_sensitive_data_alerts.createIndex({"timestamp":-1});db.agent_sensitive_data_alerts.createIndex({"is_resolved":1});// 是否解决索引

把这些JavaScript脚本保存为init/mongo/init.js,这样Docker启动MongoDB的时候就会自动执行这些脚本了。

0.1.5 安装Python依赖库

接下来,我们创建一个Python虚拟环境(推荐用venv或者conda),然后安装所需的依赖库。

首先,创建一个requirements.txt文件,内容如下:

# LangChain 相关依赖(Agent开发用) langchain==0.1.20 langchain-openai==0.1.7 langchain-community==0.0.38 langchain-core==0.1.52 langchain-experimental==0.0.57 # 用来处理结构化数据 # 数据库相关依赖 psycopg2-binary==2.9.9 # PostgreSQL驱动 pymongo==4.7.2 # MongoDB驱动 redis==5.0.4 # Redis驱动 sqlalchemy==2.0.30 # ORM框架(用来处理PostgreSQL的事务) # 其他工具依赖 python-dotenv==1.0.1 # 用来读取环境变量 pydantic==2.7.1 # 用来做数据校验 pydantic-settings==2.2.1 # 用来管理配置 python-multipart==0.0.9 # 用来处理文件上传 openpyxl==3.1.2 # 用来处理Excel文件 pandas==2.2.2 # 用来处理CSV/Excel文件 faker==25.2.0 # 用来生成测试数据 regex==2024.5.15 # 用来做正则表达式校验(比Python自带的re更强大)

然后,创建Python虚拟环境并安装依赖库:

# Windows系统python-mvenv venv venv\Scripts\activate pipinstall-rrequirements.txt# macOS/Linux系统python3-mvenv venvsourcevenv/bin/activate pipinstall-rrequirements.txt
0.1.6 创建项目结构

最后,我们创建一个清晰的项目结构,方便后续开发:

agent-db-security/ ├── .env # 环境变量文件(不要提交到Git) ├── .env.example # 环境变量示例文件(可以提交到Git) ├── .gitignore # Git忽略文件 ├── docker-compose.yml # Docker开发环境配置 ├── init/ # 数据库初始化脚本 │ ├── postgres/ │ │ └── init.sql │ └── mongo/ │ └── init.js ├── requirements.txt # Python依赖库 ├── src/ # 源代码目录 │ ├── __init__.py │ ├── config/ # 配置管理目录 │ │ ├── __init__.py │ │ └── settings.py # 全局配置 │ ├── agents/ # Agent开发目录 │ │ ├── __init__.py │ │ └── order_processing_agent.py # AI智能订单处理助手 │ ├── db/ # 数据库交互目录 │ │ ├── __init__.py │ │ ├── postgres/ # PostgreSQL交互目录 │ │ │ ├── __init__.py │ │ │ ├── connection.py # PostgreSQL连接管理 │ │ │ ├── models.py # PostgreSQL ORM模型 │ │ │ └── crud.py # PostgreSQL CRUD操作 │ │ ├── mongo/ # MongoDB交互目录 │ │ │ ├── __init__.py │ │ │ ├── connection.py # MongoDB连接管理 │ │ │ └── crud.py # MongoDB CRUD操作 │ │ └── redis/ # Redis交互目录 │ │ ├── __init__.py │ │ ├── connection.py # Redis连接管理 │ │ └── distributed_lock.py # Redis分布式锁 │ ├── security/ # 安全策略目录 │ │ ├── __init__.py │ │ ├── data_validation.py # 写入前的数据校验(白名单、格式、合理性) │ │ ├── parameterized_query.py # 参数化查询 │ │ ├── transaction.py # ACID事务 │ │ ├── audit.py # 全链路审计日志 │ │ ├── sensitive_data_detection.py # 自动敏感数据检测 │ │ └── rollback.py # 多级回滚策略 │ ├── utils/ # 工具函数目录 │ │ ├── __init__.py │ │ ├── order_id_generator.py # 订单编号生成器 │ │ ├── logistics_api.py # 第三方物流API(模拟) │ │ └── logger.py # 全局日志记录器 │ └── main.py # 项目入口文件 └── tests/ # 测试目录 ├── __init__.py ├── test_data_validation.py ├── test_parameterized_query.py ├── test_transaction.py ├── test_audit.py ├── test_sensitive_data_detection.py └── test_order_processing_agent.py

0.2 基础知识

在正式开始之前,我们先复习一下几个核心的数据库安全和ACID事务的基础知识——如果你已经很熟悉了,可以跳过这一小节。

0.2.1 SQL注入攻击

SQL注入(SQL Injection)是一种最常见的数据库安全攻击方式,攻击者通过在用户输入的数据中插入恶意的SQL代码,从而欺骗数据库服务器执行这些恶意代码。

SQL注入攻击的原理非常简单:如果我们用字符串拼接的方式构建SQL语句,那么攻击者的恶意输入就会被当成SQL代码的一部分执行。比如之前小A的AI财务报销助手的代码(简化版):

# 错误的代码:字符串拼接SQL语句,容易被SQL注入definsert_expense_record(customer_name,amount,expense_date):conn=psycopg2.connect(...)cursor=conn.cursor()# 字符串拼接SQL语句sql=f"INSERT INTO expense_records (customer_name, amount, expense_date) VALUES ('{customer_name}',{amount}, '{expense_date}');"cursor.execute(sql)conn.commit()cursor.close()conn.close()# 攻击者输入的恶意客户姓名malicious_customer_name="张三', 10000, '2024-01-01'); DELETE FROM expense_records WHERE 1=1; --"insert_expense_record(malicious_customer_name,500,'2024-05-20')

这段代码执行的SQL语句其实是:

INSERTINTOexpense_records(customer_name,amount,expense_date)VALUES('张三',10000,'2024-01-01');DELETEFROMexpense_recordsWHERE1=1;--', 500, '2024-05-20');

你看,攻击者不仅插入了一条假的报销记录,还删除了所有的报销记录!太可怕了。

SQL注入攻击的常见类型有:

  1. 基于错误的SQL注入:攻击者通过构造错误的SQL语句,让数据库服务器返回错误信息,从而获取数据库的结构信息(比如表名、列名、字段类型);
  2. 基于布尔的SQL注入:攻击者通过构造布尔表达式(比如' OR '1'='1),让数据库服务器返回不同的结果,从而判断数据库的结构信息或数据内容;
  3. 基于时间的SQL注入:攻击者通过构造时间延迟函数(比如WAITFOR DELAY '0:0:5'PG_SLEEP(5)),让数据库服务器延迟返回结果,从而判断数据库的结构信息或数据内容;
  4. 基于联合查询的SQL注入:攻击者通过构造UNION SELECT语句,把恶意查询的结果和正常查询的结果合并在一起返回,从而获取数据库的敏感数据;
  5. 基于堆叠查询的SQL注入:攻击者通过构造多个SQL语句(用分号分隔),让数据库服务器一次性执行多个SQL语句,从而执行删除、修改、插入等恶意操作。

SQL注入攻击的危害非常大:

  1. 数据泄露:攻击者可以获取数据库的所有敏感数据(比如用户的姓名、邮箱、密码、身份证号、银行卡号);
  2. 数据篡改:攻击者可以修改数据库的任意数据(比如修改用户的余额、修改订单的状态);
  3. 数据删除:攻击者可以删除数据库的任意数据甚至表结构;
  4. 服务器接管:攻击者可以通过SQL注入攻击获取数据库服务器的控制权,进而接管整个服务器。
0.2.2 ACID事务

ACID是数据库事务(Transaction)的四个基本特性,保证了数据库操作的一致性可靠性。ACID分别是:

  1. 原子性(Atomicity):一个事务中的所有操作要么全部成功执行,要么全部失败回滚,就像一个不可分割的原子一样;
  2. 一致性(Consistency):事务执行前后,数据库必须从一个一致的状态转换到另一个一致的状态(比如总金额必须等于商品数量×商品单价,订单状态必须在指定的范围内);
  3. 隔离性(Isolation):多个并发事务之间应该相互隔离,一个事务的中间状态不应该被其他并发事务看到(隔离性有四个级别:读未提交、读已提交、可重复读、串行化,后面会详细讲);
  4. 持久性(Durability):一旦事务提交成功,它对数据库的修改就应该永久保存下来,即使数据库服务器发生故障(比如断电、重启),修改的数据也不会丢失。

举个例子来说明ACID事务的重要性:银行转账(从A账户转100块钱到B账户)需要两个操作:

  1. 从A账户的余额中减去100块钱;
  2. 往B账户的余额中加上100块钱。

如果没有ACID事务,假设第一个操作成功了,但第二个操作因为网络中断失败了——那么A账户的余额少了100块钱,但B账户的余额没加,银行就会损失100块钱,用户也会投诉。但如果有ACID事务,一旦第二个操作失败了,第一个操作就会自动回滚,A账户的余额会恢复到原来的状态,不会造成任何损失。

0.2.3 最小权限原则

最小权限原则(Principle of Least Privilege,POLP)是计算机安全领域的一个基本原则,它的核心思想是:任何用户、程序、进程都应该只拥有完成其任务所必需的最小权限,而不应该拥有多余的权限

在数据库安全中,最小权限原则的应用非常重要——我们不应该给Agent使用的数据库角色赋予SUPERUSERDELETEDROPALTER这些多余的权限,而应该只赋予它完成任务所必需的SELECTINSERTUPDATE这些权限。比如我们之前在PostgreSQL里创建的agent_orders_writer角色,只有orders表和order_items表的SELECTINSERTUPDATE权限,没有DELETEDROPALTER权限——就算前两层堡垒被突破了,Agent也无法删除或修改表结构,把损失降到最低。


(未完待续,由于篇幅限制,接下来的章节会继续详细讲解第1层到第4层安全堡垒的实现,包括核心概念、原理、数学模型、算法流程图、Python源代码、项目实战、最佳实践tips、行业发展与未来趋势等内容,总字数会达到10000字左右。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 13:52:24

从PWM到DAC:在8位MCU上精准生成DTMF信号的底层原理与工程实践

1. 项目概述与核心价值如果你在嵌入式系统里搞过音频信号生成,比如用蜂鸣器播放个简单的音乐或者实现电话拨号音,大概率都接触过PWM。但很多人可能只是调调库,改改占空比,知其然不知其所以然。今天,我想从一个更底层的…

作者头像 李华
网站建设 2026/6/17 10:13:04

2026降AIGC革命:AI率92%暴降至5%!实测10款降AI率网站!10款工具深度解析!

2026 年各大高校和期刊平台的 AI 检测系统又升级了,知网 AIGC、维普 AI、万方智能检测三大平台的算法迭代速度越来越快,上个月能蒙混过关的改写方式,这个月直接就会被标红预警。单纯的同义词替换、语序调整早就不管用了,想要有效降…

作者头像 李华
网站建设 2026/6/14 6:15:34

绕过APK签名校验的另类思路:用VirtualXposed在非Root手机上运行修改版App

非Root环境下绕过APK签名校验的实战方案:VirtualXposed与签名替换技术在移动应用安全研究领域,签名校验一直是开发者与逆向工程师之间的攻防焦点。传统解决方案往往依赖于Root权限或Xposed框架,这在日益严格的安全策略和设备限制下变得愈发困…

作者头像 李华