《Effective Ecterprise Java》 笔记

只有第7章的。

关于安全:它是站在屋子中心的大象,每个人都可以看到它,每个人都认识它,但每个人都拼命地试图对它视而不见,绕开它进行工作。

  • 认证(authentication):是一种校验行为,检查系统中的一个实体是否真的与它声明的身份相符。认证有三种基本形式:根据你所知的、你所有的或你是什么来进行认证。
  • 授权(Authorize):授权行为是确认系统中的一个实体能够做什么。很多时候,成功的认证导致某种授权。

安全是一个过程,而不是产品

如果你以为技术可以解决你的安全问题,那你根本没有理解这个问题,并且你也没有理解这项技术。

安全不是那种我们可以简单地在系统实现的生命周期的某个时刻 “打开” 的特性。安全必须贯穿于系统开发的每次迭代过程的分析、设计、实现和测试中,否则,漏洞就会出现。

“编写安全代码” 应该是程序员的一条指导原则,就像 “编写好的代码”、“编写优雅的代码” 那样。

安全不仅仅是预防

任何安全系统的另外两个部分就是 检测与反应。软件不能仅仅依赖于预防,检测和反应也必须有,预防甚至不是我们首先要考虑的。

建立威胁模型

一个攻击者可以通过多种方式接触系统,要覆盖所有的入侵方式似乎是不现实的,需要准确地确定系统的哪些部分最重要且容易受攻击,优先保护它们。

为了安全性,需要某种针对我们的应用的安全性的宏图,需要知道哪个地方最容易受到攻击,以及如果被攻击会造成怎样的破坏。这些信息反过来可以帮助我们区分哪些弱点是需要关注而哪些是可以忽略的。这些资源一般被称为一个威胁模型。

如果没有威胁模型,想知道需要花多少时间和精力来防范一个指定的企业系统可能面对的某个潜在的安全攻击是不可能的。

做不安全假设

建立安全系统的一个特殊要点:你必须假设每一样东西都是不安全的,包括你正在建立的那些部分,直到你确定系统可被入侵和攻击的安全疑点都被清除了。

两条关于企业级安全性的定律:

  • 假设一个构件是不安全的,除非你能证明;
  • 一个构建永远不能被证明是安全的。

总是假设每件东西都是不安全的,假设人们会通过其中一些构件攻破系统。

现实世界中的安全系统都使用深度防御策略。它们假设在每个层次上,防御都会被攻破,因此需要另一种防御来以防万一。

我们不能阻止一个攻击者,预防本身永远不能保证提供一个安全的系统,目标是拖延攻击者,以使入侵检测系统和警报管理员可以检测并采取合适的反应措施。

这一条的结论是采用 最低权限原则。

总是验证用户输入

如何处理用户输入是建立一个安全系统的关键,任何一个系统接受的用户输入都是攻击者进入系统的通道。

必须假设客户端验证逻辑没有被执行,对于每个用户输入的提交,都要严格地进行一序列的验证校验以保证用户输入中的所有基于输入的攻击都被过滤了。

(数据与代码分离)


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。