Skip to content
This page has been auto-translated and may contain errors.View in English

什么是网络安全?

网络安全 就是在人、软件和网络做出你意料之外的事情时,让数字系统依然保持可信的工作。

这个定义故意写得很宽泛。它可以涵盖银行欺诈、恶意软件、钓鱼攻击、云基础设施、网络防御、隐私保护、事件响应等十几个专门领域。本手册并不打算把这些全部讲一遍。

本手册讲的是面向开发者的应用安全:也就是你编写、审查和发布的代码的安全性。

Juno什么是网络安全? 网络安全是个大词,但本手册会把它牢牢拴在代码上。我们关心的是:有人编辑的那个表单字段,有人请求的那条订单记录,证明身份的那个 token,还有那个被调用次数过多的接口。

这些就足够开始了。你不需要一口气学会所有安全相关的岗位技能。

Juno什么是网络安全? 网络安全涉及的范围很广。这里有用的那一部分是应用安全:也就是请求、用户、数据库记录或 token 与你发布的代码相遇的地方。

这样能让工作保持具体。如果你能通过改动路由、请求体、cookie、token、schema 或中间件路径来复现这个 bug,那它就属于本手册的讨论范围。

Juno什么是网络安全? 这里的边界是刻意划定的:应用安全,而不是整个安全行业。判断标准是:这个失败是否来自开发者能够推理、修改并做回归测试的代码、配置或数据流。

即便如此,可以出问题的地方也不少:注入、身份、授权、可用性、密钥和日志。恶意软件、网络防御和合规可以各自记各自的账。这本手册要处理的坑已经够多了。

这意味着我们关心这样一些问题:

  • 如果用户在发送之前修改了一个隐藏的表单字段,会发生什么?
  • 一个客户能读到另一个客户的订单吗?
  • 如果登录 token 泄露了,会发生什么?
  • 一个接口能不能被调用成千上万次,直到把应用拖慢?
  • 服务器会检查数据,还是只是单纯相信浏览器?

为什么是这些问题?

它们都发生在代码库、API、数据库查询、会话 cookie 和校验 schema 里面。这正是本手册要教你的、开发者力所能及的那部分网络安全。

我们是怎么走到今天的

这个词比它所指的问题出现得晚。计算机最初是实验室里的共享机器,后来才走进办公室、家庭、手机和支付系统。一旦软件开始承载金钱、身份和隐私数据,破坏软件就不再是恶作剧,而变成了一种偷窃、窥探、破坏或冒充的手段。

Web 的出现让这种转变更加明显。浏览器是一扇友好的大门,但它发送的是文本,服务器必须自己去解读:URL、header、cookie、表单、JSON 请求体、文件上传。

每一个请求都是浏览器讲给服务器听的一个小故事,而服务器必须决定要相信其中的多少。

为什么开发者需要它

早期的网站基本上就是文档。你访问一个页面,读一读,点个链接,然后离开。现代 Web 应用不一样了。它们处理支付、存储个人数据、管理身份、调用 API、上传文件,还会替用户做各种决定。

一个正常的功能,一旦信错了对象,就可能变成安全漏洞。一个搜索框可能变成注入点。一个个人资料页可能泄露别人的数据。一个好用的导出按钮,如果一次请求就能让数据库承担过多的工作,也可能变成拒绝服务问题。

好消息是,这些大多数都是可以学会的。你不需要成为密码学专家或网络工程师,就能写出更安全的后端代码。你需要的是几个习惯:

  • 留意输入进入系统的地方。
  • 在服务器端检查各种决策。
  • 把身份和权限当成两个独立的问题来对待。
  • 在功能上线之前,先想想可能出什么问题。
  • 熟悉常见的漏洞类型,做到一眼就能认出来。

这正是本手册要走的路。

Juno为什么开发者需要它 安全漏洞往往就是一个正常功能信错了对象。浏览器说这个订单是我的。URL 说这条记录是我的。请求说这个价格是三美元。

服务器必须问自己:“这件事我自己能确认吗?”整门课很大一部分内容,都围绕着这一个问题展开。

Juno为什么开发者需要它 现代应用之所以成为安全边界,是因为它们要做各种决策:谁能看到某条记录、允许执行哪个操作、输入是否有效,以及一个请求能占用多少资源。

一个经验法则是:先找到这个决策点,再找到它用了哪些数据。如果这些数据来自浏览器、某个 token、另一个服务或数据库里的旧记录,那就要让服务器先证实它,再决定要不要相信。

Juno为什么开发者需要它 大多数应用安全漏洞,本质上就是普通的控制流 bug,只不过这次房间里坐着一个心怀恶意的调用者。分支照常执行,查询照常返回,中间件照常放行,但不变量还是被打破了——因为那个决定性的值,来自边界的错误一侧。

放到生产环境里,办法其实很朴素但很管用:把控制逻辑放在真正强制执行不变量的地方,测试那条“坏路径”,并留下证据,好让下一个人明白当初为什么要加这个检查。

接下来的路

这条路从一个简单的想法开始:安全的代码,始于我们思考问题的方式。

这也是为什么第一部分要从 STRIDE 和 OWASP 讲起。STRIDE 帮你在应用还在设计阶段时,就去想哪里可能出问题。OWASP 则给那些在真实应用运行起来之后会出现的漏洞,提供了名字。

我们先建立思维方式,然后再进入具体的开发者工作:不安全的输入、XSS、SQL 注入、校验、身份认证、token、OAuth、限流和节流。

Juno接下来的路 前面几章是在学习该问什么问题。可能出什么问题?这个请求是谁发来的?这个用户被允许碰哪些东西?如果输入是恶意的,会发生什么?

在那之后,后面的章节会把这些问题变成实实在在的代码。

Juno接下来的路 顺序很重要。STRIDE 给你设计阶段该问的问题,OWASP 给已经出现在生产环境中的漏洞命名,然后分诊(triage)把一个发现变成影响评估、优先级和下一步行动。

在此之后,这个专题会把同样的循环套用到输入、身份和流量上。当修复方法始终和它所防范的漏洞绑在一起时,就更容易被记住。

Juno接下来的路 这条路是一个可运转的循环:在构建之前预判可能的失败,识别出真正上线的那些问题,判断哪些问题最先要处理,然后把这次的教训反馈到下一轮设计中去。

后面的章节都是这个循环的具体实例:解释器、身份系统、权限、请求量和运维证据。还是同一套流程,只是换了个失败场景。

## 本手册不是什么

这不是一份全面的网络安全综述。我们不会讲恶意软件分析、渗透测试工具、网络防御、合规框架或安全运维。

这些主题当然重要,只是它们不在本手册要做的这份工作范围之内。

本手册的任务更窄、也更实际:帮你构建更难被滥用、更容易被理解、也更适合直接面向真实用户上线的后端应用。

Juno本手册不是什么 把一些主题排除在外,正是让这本手册变得有用的原因之一。我们只关注你能打开、阅读和修改的代码。

也就是路由、schema、cookie、token、查询和中间件。要学的东西已经够多了,我们不假装一本手册能教会你安全领域的所有分支。

Juno本手册不是什么 本手册的范围是面向后端开发者的应用安全。这让每一章都紧贴着你能检查到的路由、schema、cookie、token、查询、中间件函数或部署配置。

如果某个话题需要用到 SOC(安全运营中心)、抓包分析、合规项目或恶意软件实验室,那就超出了本专题的范围。它们确实有用,但不是本手册要做的事。

Juno本手册不是什么 正是这种更窄的范围,让本手册有了实际的战斗力。一份大而全的综述会把每个安全领域都提一遍,但没有一个讲得透彻,结果就是搞出一份没人真正负责的检查清单。

本专题只跟着后端开发者能够修改、审查和测试的系统走:请求处理、身份、授权、校验、限流、存储和运维层面的卫生习惯。

接下来往哪走

这个词已经被收窄了:应用安全,也就是你编写、审查和发布的代码。范围已经定好,值得追问的问题也已经摆在桌面上。

现在缺的,是养成主动去问这些问题的习惯。如何思考安全问题 就是这一切的起点,从信任边界讲起,练习用一个不怀好意的人的眼光,去审视自己写的代码。