什么是网络安全?
网络安全 就是在人、软件和网络做出你意料之外的事情时,让数字系统依然保持可信的工作。
这个定义故意写得很宽泛。它可以涵盖银行欺诈、恶意软件、钓鱼攻击、云基础设施、网络防御、隐私保护、事件响应等十几个专门领域。本手册并不打算把这些全部讲一遍。
本手册讲的是面向开发者的应用安全:也就是你编写、审查和发布的代码的安全性。
这些就足够开始了。你不需要一口气学会所有安全相关的岗位技能。
这意味着我们关心这样一些问题:
- 如果用户在发送之前修改了一个隐藏的表单字段,会发生什么?
- 一个客户能读到另一个客户的订单吗?
- 如果登录 token 泄露了,会发生什么?
- 一个接口能不能被调用成千上万次,直到把应用拖慢?
- 服务器会检查数据,还是只是单纯相信浏览器?
为什么是这些问题?
它们都发生在代码库、API、数据库查询、会话 cookie 和校验 schema 里面。这正是本手册要教你的、开发者力所能及的那部分网络安全。
我们是怎么走到今天的
这个词比它所指的问题出现得晚。计算机最初是实验室里的共享机器,后来才走进办公室、家庭、手机和支付系统。一旦软件开始承载金钱、身份和隐私数据,破坏软件就不再是恶作剧,而变成了一种偷窃、窥探、破坏或冒充的手段。
Web 的出现让这种转变更加明显。浏览器是一扇友好的大门,但它发送的是文本,服务器必须自己去解读:URL、header、cookie、表单、JSON 请求体、文件上传。
每一个请求都是浏览器讲给服务器听的一个小故事,而服务器必须决定要相信其中的多少。
为什么开发者需要它
早期的网站基本上就是文档。你访问一个页面,读一读,点个链接,然后离开。现代 Web 应用不一样了。它们处理支付、存储个人数据、管理身份、调用 API、上传文件,还会替用户做各种决定。
一个正常的功能,一旦信错了对象,就可能变成安全漏洞。一个搜索框可能变成注入点。一个个人资料页可能泄露别人的数据。一个好用的导出按钮,如果一次请求就能让数据库承担过多的工作,也可能变成拒绝服务问题。
好消息是,这些大多数都是可以学会的。你不需要成为密码学专家或网络工程师,就能写出更安全的后端代码。你需要的是几个习惯:
- 留意输入进入系统的地方。
- 在服务器端检查各种决策。
- 把身份和权限当成两个独立的问题来对待。
- 在功能上线之前,先想想可能出什么问题。
- 熟悉常见的漏洞类型,做到一眼就能认出来。
这正是本手册要走的路。
服务器必须问自己:“这件事我自己能确认吗?”整门课很大一部分内容,都围绕着这一个问题展开。
接下来的路
这条路从一个简单的想法开始:安全的代码,始于我们思考问题的方式。
这也是为什么第一部分要从 STRIDE 和 OWASP 讲起。STRIDE 帮你在应用还在设计阶段时,就去想哪里可能出问题。OWASP 则给那些在真实应用运行起来之后会出现的漏洞,提供了名字。
我们先建立思维方式,然后再进入具体的开发者工作:不安全的输入、XSS、SQL 注入、校验、身份认证、token、OAuth、限流和节流。
在那之后,后面的章节会把这些问题变成实实在在的代码。
这不是一份全面的网络安全综述。我们不会讲恶意软件分析、渗透测试工具、网络防御、合规框架或安全运维。
这些主题当然重要,只是它们不在本手册要做的这份工作范围之内。
本手册的任务更窄、也更实际:帮你构建更难被滥用、更容易被理解、也更适合直接面向真实用户上线的后端应用。
也就是路由、schema、cookie、token、查询和中间件。要学的东西已经够多了,我们不假装一本手册能教会你安全领域的所有分支。
接下来往哪走
这个词已经被收窄了:应用安全,也就是你编写、审查和发布的代码。范围已经定好,值得追问的问题也已经摆在桌面上。
现在缺的,是养成主动去问这些问题的习惯。如何思考安全问题 就是这一切的起点,从信任边界讲起,练习用一个不怀好意的人的眼光,去审视自己写的代码。

