参考自:http://www.artima.com/weblogs/viewpost.jsp?thread=168511
一直以来只知道防御式编程,《代码大全》中也专门有一章讲述防御式编程,防御式编程又称被动编程。有一个比喻是说开车时司机只遵守交通规则是远远不够的,还得时刻提防其他意外因素,如马路杀手、其他醉酒的司机等等。对应在编程中就是“不能信任用户的输入,必须执行相应的参数检查”。
而offensive coding则与此相反,它的中文意思是攻击式编程或者主动编程。
先看一段简单的代码:
private void addResolution(List<Flag> flags) { if (flags != null) { if (supportedAdapters.contains(Adapter.LOW) || supportedAdapters.contains(Adapter.MEDIUM)) { flags.add(new ResolutionFlag(ADAPTED)); } } }
这段代码有啥问题?也许有人的第一反应是这段代码应该使用Guard Clause,即改成下面这样:
private void addResolution(List<Flag> flags) { if(flags == null) return; if (supportedAdapters.contains(Adapter.LOW) || supportedAdapters.contains(Adapter.MEDIUM)) { flags.add(new ResolutionFlag(ADAPTED)); } }
但其实问题不在于此,而在于这一行代码:
if(flags == null) {...
既然是private方法,那么完全可以在类内部自己保证传入的参数flags不为null,而不用进行多余的null check。
滥用null check是糟糕代码的标识。
null check是不可或缺的。如果你在你的代码中到处传递null,那么接收参数并处理的方法进行null check是必要的。但是这也意味着你的代码很糟糕。你在给自己增加额外负担(所有有参数的方法开头都必须进行null check),你的代码也很难复用。
另外一个例子:
public String [] getParameters() { if (intParms.length == 0) { return null; } String [] result = new String[intParms.length]; for(int n = 0; n < intParms.length; n++) { result[n] = "parameter " + intParms[n]; } return result; }
这段代码有什么问题呢?如果这个方法被你自己在同一个项目中其他地方使用还好,你知道返回值可能为null,所以你会进行null check。而如果是你的同事在使用这段代码,或者这段代码被打包在Jar中被世界上某个角落的另一个程序员使用呢?他们不会像你一样对你的代码这么熟悉。他们很可能忘记null check,比如如下:
// 世界上某个角落的其他程序员Fork在使用你的Jar包中的getParameters方法 public void foo() { ... int len = new ConcreteService().getParameters().length; ... }
很可能这段代码在大部分情况下都能正常运行,而不会抛出NullPointerException,于是这位程序员又将这段代码打包到他的Jar包里,之后又有第三个程序员John来使用Fork的Jar包中的foo()方法,如下:
// John使用Fork的Jar包中的代码 public void bar() { ... new Delegator().foo(); ... }
OK,问题来了,大部分时候这段代码也执行正常,但是某一天bar()突然抛出NullPointerException,你最初挖的“坑”潜伏这么久,终于有人掉进去了。John只能骂一句“好坑!”或者“Oh, shift!”了。那么最初的getParameters()方法该怎么写才好呢?很简单,像下面这样即可:
public String [] getParameters() { String [] result = new String[intParms.length]; for(int n = 0; n < intParms.length; n++) { result[n] = "parameter " + intParms[n]; } return result; }
现在如果intParms是一个空数组的话,返回的也是一个空数组。但如果intParms是null怎么办呢?很简单,intParms显然是类变量或者类成员,你只需要保证intParms始终不为null即可,比如这样:
private int[] intParms = new int[0];
然后任何对intParms的修改都不能将其设为null,但可以把它重置为空数组。这样当前类内部的处理负担可能加重了,但其他类的负担却大大减轻,别人也将更乐意使用你的代码。
相关推荐
Python For Offensive PenTest 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
Offensive Security OSCP
Offensive Security - Penetration Testing with BackTrack (Lab Guide)v3.2(英文版)
offensive-security-labs..BT 4的一个PDF
Counter-Strike Global Offensive.app.zip
Python For Offensive PenTest(conv)原装版 详细介绍可以去亚马逊上看Python For Offensive PenTest(conv)原装版 详细介绍可以去亚马逊上看Python For Offensive PenTest(conv)原装版 详细介绍可以去亚马逊上看...
"Offensive Security Web Exploitation.pdf"这本书由Joas Antonio编写,他是一位经验丰富的网络安全分析师、顾问和研究员。这本书主要针对初学者到专家级别的读者,提供100%实践性的学习体验。书中的内容基于...
OFFENSIVE SECURITY WIRELESS 在渗透测试领域中,wireless security是一个非常重要的方面。 Wireless security是指保护无线网络和设备免受非法访问、恶意攻击和数据泄露的安全措施。今天,我们将详细介绍 Wireless ...
Collection of Offensive C# Tooling
Python For Offensive PenTest 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
Backtrack 的lab书籍!!!!
这一领域中的专业认证之一是由Offensive Security提供的Offensive Security Certified Professional (OSCP)。OSCP认证是全球公认的网络安全专家资格,它要求考生具备实际的渗透测试技能,而不仅仅是理论知识。 OSCP...
Python For Offensive PenTest 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
US Army course - Offensive Electronic Warfare SS0134
在这个"Ansible-offensive-infrastructure.zip"压缩包中,我们很可能是找到了一个用于搭建进攻性网络安全测试环境的Ansible项目。进攻性基础设施通常指的是模拟黑客攻击行为的安全测试,以评估和强化组织的防御能力...
Python For Offensive PenTest 英文无水印转化版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细...
标题:Offensive Security Web Exploitation 2.pdf 描述:网络安全渗透测试 标签:渗透测试、网络、安全 知识点: 1. 基本概念:Web 应用程序安全涉及到 Hypertext Transfer Protocol (HTTP)、Hypertext Transfer ...
Abstract—Finding and exploiting vulnerabilities in binary code is a challenging task. The lack of high-level, semantically rich information about data structures and control constructs ...
在Offensive Security Consultant的角色中,如Spider Labs的职位描述所示,专业人员需要具备一系列高级技能和知识。 1. 应用安全与渗透测试:作为安全顾问,你需要深入了解应用安全,包括Web应用、IoT设备、SCADA/...
「安全研究」Offensive Memory Forensics - NGFW Linux 安全开发 信息安全 终端安全 Linux