0Pricing
Cyber Security Academy · 课时

输入验证与输出编码

在服务器端验证所有输入,在正确的上下文中对输出进行编码,并防止注入攻击。

输入验证与输出编码 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。

输入验证为何重要

当不受信任的输入被解释为代码时,就会产生 SQL、命令、LDAP、XPath 等注入漏洞。输入验证可确保数据在处理、存储或返回之前符合预期的类型、长度和格式。

允许列表与拒绝列表验证

Allowlist(白名单)验证定义哪些内容 IS 可接受:仅允许字母数字字符、仅允许 1-100 范围内的整数、仅允许有效的电子邮件格式。Denylist(黑名单)会尝试阻止已知的恶意输入,但始终不完整。请优先使用允许列表。

服务器端验证

客户端验证可以改善用户体验,但不提供任何安全性——攻击者使用浏览器开发者工具或 curl 就能轻易绕过它。请始终在服务器端进行验证。客户端验证是便利功能;服务器端验证才是安全控制措施。

不同数据类型的输入验证

数字:检查类型和范围。字符串:检查长度和字符集。日期:严格解析并检查范围。文件:检查扩展名 AND 魔数/MIME 类型——绝不要只信任扩展名。URL:解析并验证协议、主机和路径组件。

参数化查询可防止 SQLi

数据库输入验证最重要的做法是绝不将用户输入拼接到 SQL 中。请使用参数化查询(预处理语句),将用户输入作为参数传入,而不是插入 query 字符串中。

// WRONG:
const q = "SELECT * FROM users WHERE name = '" + name + "'";
// RIGHT:
const q = "SELECT * FROM users WHERE name = $1";
await client.query(q, [name]);

输出编码的上下文

同一个字符串需要根据上下文使用不同的编码。HTML 正文:HTML 编码(< > &)。HTML 属性:HTML 属性编码。JavaScript:JS 转义。URL 参数:URL 编码(百分号编码)。使用错误的编码会留下可被攻击者利用的漏洞。

使用 HTML 编码防范 XSS

绝不要将用户数据直接插入 HTML。请使用能够自动转义 HTML 的模板引擎或库。在 React 中,{value} 是安全的;dangerouslySetInnerHTML 会绕过转义。在 Django 中,模板会自动转义,除非您明确使用 safe 过滤器。

JavaScript 上下文编码

将数据插入 JavaScript 时(例如,使用用户数据初始化变量),仅进行 HTML 编码是不够的。请使用 JSON 编码:JSON.stringify(value)。这样可以防止数据突破 JS 字符串字面量上下文。

URL 编码

插入 URL 的用户提供数据必须使用 encodeURIComponent()(JS)或 urllib.parse.quote()(Python)进行百分号编码。未经编码的数据可能操纵 URL 结构,从而导致开放重定向或路径遍历。

内容安全策略作为纵深防御

CSP 为防范 XSS 增加了第二道防线。使用随机数的严格 CSP 可以阻止内联脚本执行,即使注入了 XSS 载荷也一样,因为浏览器不会执行缺少正确随机数属性的脚本。

防止基于 DOM 的 XSS

当 JavaScript 从攻击者控制的来源(location.hash、document.URL、cookie)读取数据,并将数据写入危险汇(innerHTML、document.write、eval)时,就会发生 DOM XSS。请使用静态分析工具审计从浏览器 API 到 DOM 汇的所有数据流。

知识检查

即使已经实施客户端验证,为什么服务器端输入验证仍然必不可少?

总结

输入验证(允许列表、类型检查、长度限制)与基于上下文的输出编码(HTML、JS、URL、SQL 参数化)相结合,是防范注入和 XSS 攻击的主要措施。两者都必须毫无例外地在服务器端应用。

常见问题解答

「输入验证与输出编码」课时是免费的吗?

是的 — 「输入验证与输出编码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。

「输入验证与输出编码」这节课中我会学到什么?

在服务器端验证所有输入,在正确的上下文中对输出进行编码,并防止注入攻击。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cyber Security Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「输入验证与输出编码」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cyber Security Academy 课中编写并运行代码吗?

能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 输入验证与输出编码
  2. 安全的依赖项管理
  3. OWASP ASVS:应用安全验证标准
  4. 安全代码审查技术
← 返回 Cyber Security Academy