flawopen.com/目录/参考指南
开发者安全参考指南
使用这些参考指南检查框架、ORM、身份验证、无服务器应用和 AI 智能体执行中的安全假设。每篇指南都将原理说明和修复方法与技术细节联系起来。
- Claude Code MemoryTrap:AI记忆投毒 — flawopen.com
Cisco披露的MemoryTrap:Claude Code持久记忆、v2.1.50修复及智能体防护措施。
- AI 智能体沙箱:容器、gVisor 与微型虚拟机
比较 AI 智能体使用容器、gVisor 和微型虚拟机时的隔离边界。
- AI 智能体工具权限与最小授权
通过专用工具、用户级授权和最小权限,降低 AI 智能体的过度代理风险。
- AI PR 机器人:防止 SSRF — flawopen.com
说明不可信 Pull Request 文本如何影响 AI 工具,以及如何限制机器人权限和网络访问。
- Android addJavascriptInterface 的安全风险
了解 WebView 桥如何向所有 frame 暴露原生方法、XSS 何时会触及应用能力,以及如何隔离不可信页面。
- Angular XSS 防护:安全默认行为与绕过 API
Angular 会转义插值并清理 HTML 与 URL 绑定。了解 bypassSecurityTrust* 如何关闭防护,以及如何审计 XSS sink。
- MIME 嗅探 XSS:Content-Type 与 nosniff
了解 MIME 嗅探如何让上传文件变成浏览器文档、nosniff 的作用,以及安全提供文件的方法。
- strncpy() 比 strcpy() 更安全吗?
在 C 中 strncpy() 比 strcpy() 少一个越界风险,但不保证以空字符结尾。了解为何仍需检查 snprintf 和 strlcpy。
- CSP 与输出转义:两者都需要吗?
按上下文进行输出编码可预防 XSS;CSP 可在遗漏时限制部分影响。了解如何组合这两层防护。
- GET 请求需要 CSRF 令牌吗?
安全的 GET 不应改变状态。了解哪些不安全方法需要 CSRF 令牌,以及如何修复旧的状态变更型 GET 接口。
- CWE 与 CVE:有什么区别?
CWE 与 CVE:有什么区别?:CWE 是类别——一类缺陷,比如"SQL 注入"(CWE-89)。CVE 是实例——一次具体、有记录的出现
- React 的 dangerouslySetInnerHTML 安全吗?
React 会转义 JSX 文本,但 dangerouslySetInnerHTML 会解析 HTML。了解如何审查此 XSS 输出点并安全呈现富文本。
- Dependency Confusion:风险与防护
了解包来源歧义如何引入非预期依赖,以及 registry 策略、锁文件和 CI 控制如何降低风险。
- Django ORM 与 SQL Injection:安全写法
Django QuerySet 会参数化值。了解 raw SQL、动态表达式和查询结构的风险及审查方法。
- Docker 套接字暴露:风险与防护
暴露 Docker 守护进程套接字可能授予调用方守护进程级别的权限。了解其边界、能力风险和更安全的容器设置。
- Doctrine ORM SQL 注入:安全查询实践
使用参数绑定 DQL 和 SQL 值。了解 QueryBuilder 表达式的注入风险,以及如何安全地允许动态排序。
- DOMPurify 足以保护 innerHTML 吗?
在正确的插入点使用 DOMPurify 可保护富 HTML。了解上下文限制、清理后修改、Trusted Types 和生产检查。
- .NET BinaryFormatter:风险与迁移
Microsoft 明确指出 BinaryFormatter 不安全且无法修复。了解反序列化风险、.NET 9 行为和迁移方案。
- .NET XmlReader 能防御 XXE 吗?
XmlReader 默认禁止 DTD。了解 .NET Framework 4.5.2 的解析器变化、旧 API 的差异,以及如何安全解析 XML。
- EF Core FromSqlRaw:安全参数化 SQL
在 FromSqlRaw 中使用独立参数,避免拼接输入。了解 FromSqlInterpolated、EF Core 版本差异及安全动态 SQL。
- Node.js exec() 与 execFile():区别与安全用法
比较 Node.js 的 exec() 和 execFile():shell、参数、命令注入,以及何时使用各 API。
- FastAPI SQL 注入:Pydantic 能防什么,不能防什么
FastAPI 会验证请求数据,但 SQL 安全取决于查询的构造方式。了解 SQLAlchemy 参数绑定和动态标识符的安全处理。
- Node.js fetch() SSRF:安全获取远程 URL
服务器端 fetch() 可能访问用户选择的目标。了解固定目标映射、重定向、DNS 和出站网络限制。
- FreeMarker 与 Velocity SSTI:安全使用模板
控制模板来源、限制可访问的 Java 对象并隔离渲染,以降低 FreeMarker 和 Velocity 中 SSTI 的风险。
- GitHub Actions 脚本注入:安全处理工作流输入
GitHub 上下文值插入 run 后可能变成 shell 命令。了解 env 传值、令牌权限和 pull_request_target 风险。
- GORM Raw SQL:防止 Go 中的 SQL 注入
使用 GORM Raw 绑定参数。了解值为何能安全绑定、SQL 标识符为何需要白名单,以及如何审查查询。
- 转义引号足以防止 SQL Injection 吗?
不够。参数化查询将数据与 SQL 分开;转义依赖数据库且容易出错。动态标识符应使用白名单。
- 使用 ORM 足以防止 SQL 注入吗?
使用 ORM 足以防止 SQL 注入吗?:就其标准查询 API 而言,是的。每个主流 ORM 也都提供了原始 SQL 的逃生口,而这些
- Java XXE:DocumentBuilderFactory 默认安全吗?
JDK 解析器默认限制部分攻击,但不会禁用外部访问。了解安全设置和 Provider 差异。
- Java ObjectInputStream 安全:降低反序列化风险
不可信 Java 数据可能在 readObject() 期间触发 gadget 行为。了解过滤器、安全格式和旧数据流防护。
- Java Runtime.exec() 与 Command Injection:区别是什么?
Runtime.exec(String) 不会启动 shell,但输入仍可能改变参数。使用 ProcessBuilder,并验证每个值。
- Node.js ReDoS:正则表达式与 CVE-2026-83606
了解正则回溯如何阻塞 Node.js、CVE-2026-83606 案例及修复方法。
- Jinja2 的 render_template_string() 安全吗?
使用由应用控制的模板字面量,并通过上下文传入用户数据。了解 SSTI、自动转义和 CVE-2024-56201 的具体触发条件。
- JSON.parse() 会导致原型污染吗?
JSON.parse() 不会污染原型。风险出现在后续不安全的对象合并、路径写入或键复制中。本文说明如何追踪具体写入点,并安全地处理不可信数据,同时区分目标对象原型变化与共享原型污染。
- JSON.parse() 比 eval() 更安全吗?
了解 JSON.parse() 如何将输入视为数据、eval() 如何执行输入,以及 reviver 回调的作用。
- localStorage 中的 JWT 与 HttpOnly Cookie:哪个更安全? — flawopen.com
localStorage 中的 JWT 与 HttpOnly SameSite Cookie 的架构对比:XSS 令牌窃取、CSRF 权衡以及推荐的认证架构。
- Knex.js 能防止 SQL 注入吗?
Knex 会绑定查询值。了解 knex.raw() bindings 和动态 SQL 标识符的允许列表。
- lodash.merge() 能防止原型污染吗?
Lodash 的修复因函数和版本而异。查看受影响范围、当前修复版本以及安全处理对象的方法。
- Markdown 渲染能防御 XSS 吗?
Markdown 不会自动保证 HTML 安全。了解原始 HTML 何时会透传,以及如何正确清理渲染结果。
- Mass Assignment:风险与安全字段白名单
Mass Assignment 会让请求修改用户无权控制的字段。了解字段白名单和授权检查。
- MCP 安全:工具权限边界 | FlawOpen
了解 MCP 信任边界,并限制本地工具、权限和用户授权,降低敏感数据暴露风险。
- MyBatis ${} 与 #{}:防止 SQL Injection
MyBatis 中,#{} 通过 JDBC 绑定值;${} 直接插入 SQL 文本。了解安全绑定和动态标识符白名单。
- MySQLi 与 PDO:安全使用预处理语句
MySQLi 和 PDO 都可通过预处理语句防止 SQL Injection。比较参数绑定、驱动差异和安全查询模式。
- Newtonsoft.Json TypeNameHandling:安全配置?
Json.NET 会从 $type 读取 CLR 类型名。不可信 JSON 应将 TypeNameHandling 设为 None;否则用严格 binder 验证类型。
- Next.js Server Actions CSRF:Origin 与安全配置
了解 Next.js 的 Origin 检查、代理和 allowedOrigins 信任风险,以及如何为每个操作执行授权。
- Serverless 状态泄漏:按请求隔离用户数据
了解复用的无服务器运行时如何暴露旧用户数据,以及如何按请求隔离身份和状态。
- NHibernate 能防止 SQL 注入吗?
NHibernate 的 HQL 参数将值与查询语法分离。了解字符串插值和动态标识符仍会带来的风险。
- Node.js child_process.exec() 命令注入风险
Node.js exec() 会启动 shell。了解不可信输入何时会导致命令注入,以及 execFile() 和输入校验如何改变执行路径。
- 什么是参数化查询?
什么是参数化查询?:参数化查询就像填写带标注空格的表单,而不是手写整封信。数据库先收
- Prisma $queryRaw 能防止 SQL 注入吗?
Prisma 会参数化 tagged template 中的值。了解 raw 查询何时安全,以及 SQL 标识符为何需要白名单。
- Rails where() 字符串插值安全吗?
在 where() 中插入请求数据可能导致 SQL Injection。应使用哈希条件或绑定参数。
- AI 智能体工具安全与隔离
通过用户级授权、高影响操作审批和隔离执行来保护 AI 智能体工具。了解沙箱与网络隔离的边界。
- Sequelize query() 能防止 SQL 注入吗?
Sequelize raw 查询需要单独传参。了解 replacements、bind 与 SQL 标识符的区别。
- SQLAlchemy text() 能防止 SQL 注入吗?
SQLAlchemy text() 接受原始 SQL;应通过 execute() 绑定值。了解字符串插值和动态标识符为何仍需审查。
- SSRF 与云元数据:凭据风险和防护措施
了解 SSRF 如何访问云元数据、凭据在什么情况下可能暴露,以及如何通过云厂商控制、最小权限和出站规则降低风险。
- Svelte 默认能防止 XSS 吗?
Svelte 会转义普通文本表达式。了解为何 {@html} 需要可信或经过清理的 HTML,以及如何查找其用法。
- TypeORM QueryBuilder 能防止 SQL 注入吗?
TypeORM 会绑定 QueryBuilder 参数。了解为何仍需审查插值条件、raw SQL 和动态标识符。
- Vue v-html 的 XSS 风险
Vue 默认会转义 {{ }} 文本,但 v-html 会渲染原始 HTML。了解 XSS 风险、富文本安全处理,以及如何审计 .vue 文件。
- Cosign GHSA-fx35-mq7g-6g98:旧版 Bundle 验证绕过
了解旧版 Cosign JSON Bundle 如何绕过身份校验、修复版本及如何加固 CI 中的 Blob 验证。
- MongoDB NoSQL 注入:安全查询过滤器
了解未经验证的 JSON 对象如何改变 MongoDB 过滤器、如何校验类型并测试修复。
- 数字 ID 使用字符串拼接也会导致 SQL 注入吗?
即使是数字 ID,通过字符串格式化拼入查询也有风险。了解原因并使用参数化查询。
- Object.assign() 与原型污染:哪些用法安全?
Object.assign() 可能通过 __proto__ 更改目标原型。了解它与对象展开的差异,以及如何加固深度合并。
- Node.js path.join() 无法阻止路径穿越
path.join() 会规范化路径,但仍允许 ..;应解析并验证路径包含关系,同时单独处理符号链接。
- PHP include() 与用户控制的路径
了解 include() 如何导致文件泄露或代码执行,以及如何通过固定允许列表修复。
- PHP == 与 Magic Hash 比较
PHP 8 仍会按数值比较两条数字字符串,因此 0e 哈希仍可能相等。验证输入类型,并用 hash_equals() 比较秘密值。
- PHP unserialize() 与不可信数据
PHP 不建议对不可信数据使用 unserialize(),即使设置 allowed_classes。应使用 JSON;解析可信序列化数据前先验证其来源。
- 修复 Python os.path.join() 路径穿越
了解 os.path.join() 对绝对路径和 .. 的处理;解析路径并用 commonpath() 检查范围。
- Python pickle.load():不可信数据的安全风险
Python pickle 在加载时可能执行代码。了解 CWE-502,并将不可信输入改为经过验证的 JSON。
- Python XML XXE 安全:ElementTree、Expat 与 lxml
ElementTree 能防止 XXE 吗?了解 Expat 版本风险、lxml 解析器选项和不可信 XML 的安全处理。
- 什么是 ReDoS(灾难性回溯)?
了解含糊正则表达式如何导致拒绝服务,以及如何安全限制匹配开销。
- Ruby YAML.load 安全吗?Psych 版本与 safe_load
检查 Psych 版本,使用 safe_load;切勿通过不安全 API 反序列化不可信 YAML 或 Marshal 数据。
- Rust 的 unsafe 块仍能保证内存安全吗?
了解 Rust unsafe 代码如何破坏内存不变量、Iterator::size_hint 为什么不是安全保证,以及如何防止越界写入。
- SameSite=Strict 能取代 CSRF 令牌吗?
了解 SameSite=Strict 和 Lax 的保护范围、跨子域限制,以及何时还应使用 CSRF 令牌。
- sqlx 编译时查询检查能防止 SQL 注入吗?
了解 query! 检查什么、如何用绑定参数防止 SQL 注入,以及何时 query().bind() 也是安全的。
- 什么是服务端模板注入?
了解 SSTI 的成因、影响为何取决于模板引擎,以及如何将不可信数据与模板代码分开。
- 存储过程能防止 SQL 注入吗?
存储过程只有在使用绑定参数时才能防止 SQL 注入;了解如何安全处理动态 SQL 和标识符。
- 上传 SVG 有 XSS 风险吗?
了解 SVG 脚本何时会执行,以及如何清理、栅格化并隔离用户上传的文件。
- WKWebView loadHTMLString 能安全显示不可信内容吗?
WKWebView 会渲染传入的 HTML 和脚本。了解何时净化内容,以及如何保护原生桥接。
- 反射型、存储型与 DOM 型 XSS 有何区别?
比较反射型、存储型和 DOM 型 XSS,并了解如何在安全的渲染位置修复。
- 什么是 Zip Slip 漏洞?
了解 ZIP 条目中的恶意文件名如何逃逸解压目录,以及如何安全地验证每个路径。