`

java安全编码指南之基础篇

阅读更多

简介

作为一个程序员,只是写出好用的代码是不够的,我们还需要考虑到程序的安全性。在这个不能跟陌生人说话世界,扶老奶奶过马路都是一件很困难的事情。那么对于程序员来说,尤其是对于开发那种对外可以公开访问的网站的程序员,要承受的压力会大很多。

任何人都可以访问我们的系统,也就意味着如果我们的系统不够健壮,或者有些漏洞,恶意攻击者就会破门而入,将我们辛辛苦苦写的程序蹂躏的体无完肤。

所以,安全很重要,今天本文将会探讨一下java中的安全编码指南。

java安全编码指南之:基础篇

 

java平台本身的安全性

作为一个强类型语言,java平台本身已经尽可能的考虑到了安全性的,为我们屏蔽了大多数安全性的细节。

比如可以为不同级别权限的代码提供受限的执行环境。 java程序是类型安全的,并且在运行时提供了自动内存管理和数组边界检查,Java会尽可能的及早发现程序中的问题,从而使Java程序具有很高的抵抗堆栈破坏的能力。

尽管Java安全体系结构在许多情况下可以帮助保护用户和系统免受恶意代码或行为不当的攻击,但它无法防御可信任代码中发生的错误。也就说如果是用户本身代码的漏洞,java安全体系是无法进行判断的。

这些错误可能会绕过java本身的安全体系结构。在严重的情况下,可能会执行本地程序或禁用Java安全性。从而会被用来从计算机和Intranet窃取机密数据,滥用系统资源,阻止计算机的有用操作,协助进一步的攻击以及许多其他恶意活动。

所以,最大的安全在程序员本身,不管外部机制如何强大,如果核心的程序员出了问题,那么一切都将归于虚无。

接下来,我们看下java程序员应该遵循一些什么行为准则,来保证程序的安全性呢?

安全第一,不要写聪明的代码

我们可能会在很多教科书甚至是JDK的源代码中,看到很多让人惊叹的代码写法,如果你真的真的明白你在做什么,那么这样写没什么问题。但是很多情况下我们并不是很了解这样写的原理,甚至不知道这样写会出现什么样的问题。

并且现代系统是一个多人协作的过程,如果你写了这样的聪明代码,很有可能别人看不懂,最后导致未知的系统问题。

给大家举个例子:

:(){:|:&};:

上面是一个shell下面的fork雷区,如果你在shell下面运行上面的代码,几秒之后系统就会宕机或者运行出错。

怎么分析上面的代码呢?我们把代码展开:

:()

{

:|:&

};

:

还是不明白? 我们把:替换成函数名:

fork()

{

fork|fork&

};

fork

上面的代码就是无限的fork进程,通过几何级数的增长,最后导致程序崩溃。

java设计的很多大神把他们跳跃般的思想写到了JDK源代码里面,大神们的思想经过了千锤百炼,并且JDK是Java的核心,里面的代码再优化也不为过。

但是现在硬件技术的发展,代码级别的优化可能作用已经比较少了。为了避免出现不可知的安全问题,还是建议大家编写一眼就能看出逻辑的代码。虽然可能不是那么快,但是安全性有了保证。除非你真的知道你在做什么。

在代码设计之初就考虑安全性

安全性应该是一个在编写代码过程中非常重要的标准,我们在设计代码的时候就应该考虑到相关的安全性问题,否则后面重构起来会非常费事。

举个例子:

public final class SensitiveClass {

private final Behavior behavior;

// Hide constructor.

private SensitiveClass(Behavior behavior) {

this.behavior = behavior;

}

// Guarded construction.

public static SensitiveClass newSensitiveClass(Behavior behavior) {

// ... validate any arguments ...

// ... perform security checks ...

return new SensitiveClass(behavior);

}

}

上面的例子中我们使用了final关键字来防止我们的某些关键类被继承扩展。因为没有扩展性,所以安全性判断会更加容易。

同时,java提供了SecurityManager和一系列的Permission类,通过合理的配置,我们可以有效的控制java程序的访问权限。

避免重复的代码

和重复代码相关的一个关键词就是重构。为什么会出现重复代码呢?

很简单,最开始我们在实现一个功能的时候写了一段代码逻辑。结果后面还有一个方法要使用这段代码逻辑。然后我们为了图方便,就把代码逻辑拷贝过去了。

看起来问题好像解决了。但是一旦这段业务逻辑要修改,那可就是非常麻烦的一件事情。因为我们需要找到程序中所有出现这段代码的地方,然后一个一个的修改。

为什么不把这段代码提取出来,做成一个单独的方法来供其他的方法调用呢?这样即使后面需要修改,也只用修改一处地方即可。

在现实的工作中,我们经常会遇到这种问题,尤其是那种年久失修的代码,大家都不敢修改,因为牵一发而动全身。往往是修改了这边忘记了那边,最后导致bug重重。

限制权限

JDK专门提供了一个SecurityManager类,来显示的对安全性进行控制,我们看下SecurityManager是怎么使用的:

SecurityManager security = System.getSecurityManager();

if (security != null) {

security.checkXXX(argument, ...);

}

SecurityManager提供了一系列的check方法,来对权限进行控制。

权限分为以下类别:文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化。管理各种权限类别的类是 :

java.io.FilePermission、

java.net.SocketPermission、

java.net.NetPermission、

java.security.SecurityPermission、

java.lang.RuntimePermission、

java.util.PropertyPermission、

java.awt.AWTPermission、

java.lang.reflect.ReflectPermission

java.io.SerializablePermission

JDK本身已经使用了很多这些权限控制的代码。比如说我们最常用的File:

public boolean canRead() {

SecurityManager security = System.getSecurityManager();

if (security != null) {

security.checkRead(path);

}

if (isInvalid()) {

return false;

}

return fs.checkAccess(this, FileSystem.ACCESS_READ);

}

上面是File类的canRead方法,我们会首先去判断是否配置了SecurityManager,如果配置了,则去检查是否可以read。

如果我们在写代码中,遇到文件、套接字、网络、安全性、运行时、属性、AWT、反射和可序列化相关的操作时,也可以考虑使用SecurityManager来进行细粒度的权限控制。

构建可信边界

什么是可信边界呢?边界主要起拦截作用,边界里边的我们可以信任,边界外边的我们就不能信任了。

对于不能信任的外边界请求,我们需要进行足够的安全访问控制。

比如说web客户端来访问web服务器。web客户端是在全球各地的,各种环境都有,并且是不可控的,所以web客户端访问web服务器端的请求需要进行额外的安全控制。

而web服务器访问业务服务器又是不同的,因为web服务器是我们自己控制的,所以安全程度相对较高,我们需要针对不同的可信边界做不同的控制。

封装

封装(Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。通过对接口进行访问控制,可以严格的包含类中的数据和方法。

并且封装可以减少耦合,并且隐藏实现细节。

写文档

最后一项也是非常非常重要的一项就是写文档。为什么接别人的老项目那么痛苦,为什么读源代码那么困难。根本的原因就是没有写文档。

如果不写文档,可能你自己写的代码过一段时间之后也不知道为什么当时这样写了。

所以,写文档很重要。

载自:程序那些事

 

分享到:
评论

相关推荐

    java工程师成神之路丨超全知识指南 基础篇.pdf

    《Java工程师成神之路丨超全知识指南》基础篇是一本为Java开发者提供全面学习指南的电子书,内容旨在帮助初学者和中级Java程序员建立扎实的基础,并逐步提高技能。本书是由阿里云开发者社区和Hollis(一位阿里巴巴的...

    Java代码审计(入门篇).pdf

    本书可以作为Java开发人员的代码审计入门宝典与安全开发实战指南,帮助开发人员了解安全人员做Web漏洞挖掘时在想什么,并思考、绘制属于自己的Java安全知识、技能结构图,能知己知彼,百战不殆。 本书《Java代码...

    Java语言程序设计——基础篇

    综上所述,“Java语言程序设计——基础篇”这本书全面地介绍了Java语言的基础知识,适合Java初学者作为入门指南。通过系统学习这些知识点,读者可以掌握Java编程的基本技能,并为进一步深入学习打下坚实的基础。

    《Java技术指南2019》

    该书分为基础篇、进阶篇、高级篇、架构篇和拓展篇五个部分,覆盖了Java编程的多个层面,包括Java虚拟机(JVM)的深入理解、Java基础语法、并发编程、网络编程以及最新的Java技术动态。书中还推荐了一系列的参考书籍...

    Android编码规范指南.docx

    这篇文档主要基于Google的Java编程风格,提供了Android编码的一些基本准则。 1. **术语定义** - **class**: 在这里指的是普通类、枚举类、接口以及注解类型。 - **comment**: 特指实现注释,不同于Javadoc。 2. ...

    Java电子书打包-6

    一个一个上传太累了,又因为权限限制,我尽可能多的放一起...Java语言程序设计-基础篇(原书第8版).pdf.rar JBPM工作流开发指南 .pdf JDK1.5的泛型实现.pdf JSTL标签.pdf MyEclipse.6.Java.开发中文教程(1-10章).pdf }

    藏经阁-Java工程师成神之路-375页

    《Java工程师成神之路》是一本专为Java工程师打造的技术指南,旨在帮助读者从基础知识到高级技巧全面掌握Java编程。本书分为六个篇章,包括基础篇、底层篇、进阶篇、高级篇、架构篇和扩展篇,覆盖了从面向对象编程到...

    藏经阁-Java工程师成神之路-375.pdf

    【Java工程师成神之路】是一本专为Java工程师打造的技术成长指南,由阿里云开发者社区与技术专家Hollis合作出版。这本书分为基础篇、底层篇、进阶篇、高级篇、架构篇和扩展篇六大部分,覆盖了从入门到精通的全方位...

    Java开发指南-Servlets和JSP篇

    本指南将深入探讨这两个技术,帮助开发者理解它们的内部工作机制,以及它们如何协同工作来提供高效的服务。 Servlet是Java编程语言的一个接口,由Java Servlet API定义,它允许开发人员扩展Web服务器的功能。...

    代码实例-基于JAVA的安全电子商务(论文).rar

    9. **安全编码规范**:遵循OWASP(开放网络应用安全项目)的安全编码指南,避免常见的编程错误,如输入验证不足、跨站脚本(XSS)、跨站请求伪造(CSRF)等。 10. **持续更新和安全审计**:JAVA的更新频繁,及时...

    Java开发指南--Servlets和JSP篇

    在"Java开发指南--Servlets和JSP篇"中,读者将全面学习到这些概念,并通过实践示例巩固理论知识,为成为一名合格的Java Web开发者打下坚实基础。无论是初学者还是有经验的开发者,都能从中受益,提升自己的技能水平...

    Java学习路径(一)工具篇

    应用服务器(App Server)是运行Java企业级组件的平台,提供了丰富的服务和资源,如事务管理、持久化、安全性等,是构建大型Java应用的基础。目前市场上的主流应用服务器有BEA的WebLogic Server、IBM的WebSphere、...

    Java编码规范及实践

    《Java编码规范及实践》是针对Java开发人员的一份详尽指南,旨在提升代码质量、增强可读性和可维护性,以及确保团队间代码风格的一致性。本篇将深入探讨该文档涵盖的关键知识点,包括编码规范的重要性和具体实践。 ...

    Java开发指南--Servlets和JSP篇(PDG)

    综上所述,《Java开发指南--Servlets和JSP篇》涵盖了从基础到高级的Java Web开发知识,包括Servlet的生命周期、JSP的核心元素、两者之间的协作以及相关的Web开发最佳实践。通过学习这个教程,开发者能够熟练掌握构建...

    Java工作实用篇.pdf

    ### Java工作实用篇知识点概述 #### 1. Java生成带Logo及名称的二维码 - **技术背景**: 在当前数字化时代,二维码被广泛应用于各种场景,包括但不限于产品追踪、广告推广等。利用Java来生成带有公司Logo及商品名称...

    Java学习材料(499篇文章)

    这份"Java学习材料(499篇文章)"的压缩包显然是一份丰富的学习资源,涵盖了Java的基础到高级主题,旨在帮助开发者深入理解并掌握Java编程。 首先,我们来看"CLASSPATH"这个知识点。在Java中,CLASSPATH环境变量是...

    _Java学习材料(499篇文章)等自己整理的资料——.rar_java

    遵循Java编码规范,如命名规则、注释标准、代码格式化等,有助于写出更清晰、更易于维护的代码。此外,了解和实践SOLID原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则)是提升代码设计...

    毕业论文设计-IT计算机-基于Java的两个通用安全模块的设计与实现.zip

    这篇毕业论文设计主要聚焦在基于Java的两个通用安全模块的设计与实现上,旨在为IT计算机领域的软件开发提供更安全、可靠的基础架构。论文涵盖了源码分析、开题报告以及答辩等多个方面,对于深入理解Java安全编程具有...

    Java工程师新人入门书籍推荐

    基础篇.Basic concepts》:尽管现代开发更多依赖Spring等框架,但了解Java EE基础仍然有益。 - 《漫谈设计模式:从面向对象开始》:介绍了设计模式,对于软件设计至关重要,尤其是单例、工厂和代理模式。 - ...

Global site tag (gtag.js) - Google Analytics