不能。只读事务仅限制写操作,无法防御SQL注入,攻击者仍可执行SELECT、UNION、延时函数等恶意查询;防注入核心是参数化查询与最小权限账户配合。只读事务真能防 SQL 注入吗不能。只读事务 SET TRANSACTION READ ONLY 或 START TRANSACTION READ ONLY 仅限制写操作,对 SQL 注入毫无防御力——攻击者照样能执行 SELECT、UNION、EXECUTE(如 PostgreSQL 的 pg_sleep())甚至带副作用的函数。它防的是误写,不是恶意拼接。常见错误现象:上线后开了只读事务,结果仍被扫出 1' OR SLEEP(5)-- 延时注入;日志里看到大量 SELECT ... FROM users WHERE id = '1' UNION SELECT password FROM admins ——这些查询在只读事务里照常执行。真正起作用的其实是参数化查询 + 权限隔离防注入的核心从来不是事务模式,而是让 SQL 结构和数据彻底分离。只读事务只有配合最小权限账户,才构成一层有效防线。数据库用户必须只拥有 SELECT 权限(禁止 CREATE、EXECUTE、LOAD 等)所有查询必须用预编译语句:PreparedStatement(Java)、pg_query_params()(PHP/PgSQL)、cursor.execute("SELECT * FROM t WHERE id = %s", [user_id])(Python/psycopg2)禁用字符串拼接构造 SQL,尤其是拼接表名、字段名、排序方向等动态部分——这些无法参数化,需白名单校验PostgreSQL / MySQL 中只读事务的实际用途它主要解决一致性与并发问题,不是安全机制。比如长查询期间避免被其他事务的写操作阻塞,或确保多次 SELECT 看到同一快照。使用场景: 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐