-
2019-05-07 10:33:16
没有人能保证他产出的代码一定是完美的。下文阐述了4种主流的代码审查(code review)类型,相信作为专业的开发人员,你应该都了解它们!
每个专业的软件开发者都知道,代码审查是任何正式开发过程中的必要环节。但大多数开发者不知道的是,代码审查分为很多种类型。根据你项目和团队架构的不同,每一种代码审查类型都有它特有的优缺点。
我将在本文列出几种代码的审查的类型,并详细解释它们各自是如何工作的。并且,我也将对你在何时做出哪种选择给出一些建议。
好了,让我们开始吧。
首先,在一个很高的层面,你可以将代码审查归为两大类:正式的代码审查(formal code review),和轻量级的代码审查(light weight code review)。
正式的代码审查
正式的代码审查是基于正式的开发流程。其中最流行的实践是范根检查法(Fagan inspection)。它为试图寻找代码的缺陷提供了一种非常结构化的流程,并且,它还可以用于发现规范(specifications)中的或者设计中的缺陷。
范根检查法由6个步骤组成:计划(Planning),概述(Overview),准备(Preparation),召开检查会议(Inspection Meeting),重做(Rework),和追查(Follow-up)。基本的思想是:预先制定好每一个步骤所需要达到的输出要求。接下来,当进行到某个过程时,你检查其现在的输出,并与之前制定的理想输出要求做比较。然后,你由此来决定,是否进入下一个步骤,或者仍需在当前步骤继续工作。
这种结构化的流程用的并不多。事实上,在我的职业生涯中,我从没遇到过哪一个团队使用这种方法,而且我也不认为我能在将来看到这种情况。
我认为其原因是,这种流程带来很大的开销,并没有多少团队用到它。
然而,如果你开发的软件生死攸关,会因为有缺陷而让人丧命,那么以这种结构化的方式去查找软件缺陷就显得很合理了。
例如,你是为核电站开发软件。你可能需要一个非常正式的流程去保证最终交出去的代码是没有问题的。
但像我所说,我们大部分开发者所做的软件都不是危及生命的,因此我们使用一种更加轻量的代码审查方法作为正式流程的替代。
所以,让我们来看看这种轻量级的方法。
轻量级的代码审查
如今,轻量级的代码审查在开发团队中很常用。你可以将轻量级的代码审查细分为不同的子类:
瞬时的代码审查,也称为结对编程(pair programming);
同步的代码审查,也称为即时(over-the-shoulder)代码审查;
异步的代码审查,也称为有工具支持的(tool-assisted)代码审查;
偶尔的代码审查,也称为基于会议的(meeting-based)的代码审查。
类型1:瞬时的代码审查
第一种类型是瞬时代码审查,它发生在结对编程的情景中。当一个开发者在敲键盘写代码的同时,另一个开发者盯着代码,注意着代码中潜在的问题,并在此过程中给出提升代码质量的建议。复杂的业务问题
当你需要解决一个复杂问题时,这种代码审查的方法很适用。在仔细寻找解决方案的过程中,把两个人的脑力聚集起来,会增加成功的几率。让两个头脑思考同一个问题,并相互讨论可行的方案,这样你会更可能覆盖到问题的一些边界情况。
在遇到需要很多复杂业务逻辑的任务时,我喜欢使用结对编程。这样,有助于两个人彻底理清流程中的所有不同的可能性,保证所有情况都在代码中得到了适当的处理。
与复杂的业务逻辑不同,有时,你也会需要去解决一个复杂的技术问题。例如,你在使用一个新的框架,或者在探索之前你没用过的一些新技术。在那种情况下,最好还是单独行动,因为你可以根据自己的情况作出快速调整。为了弄清新技术是如何工作的,你需要上网搜索大量资料,或者阅读文档。
这时,结对编程的帮助就不大了,因为你们会成为各自获取这些知识的阻碍。
然而,当你被问题卡住之后,与你的同事交流一下解决方案,往往会帮你获得看问题的不同视角。
相同的专业水平
考虑进行结对编程的另一个重要方面,是一起工作时,两个开发者的专业水平。两个开发者最好是处于同一水平,因为这样他们才能以相同的速度一起工作。
让一个初级开发者和一个高级开发者进行结对编程,效果并不好。在初级开发者负责写代码的时候,坐在旁边的高级程序员可能会因为他写得太慢了而感到烦恼。如此设定,这个高级程序员的能力就被限制住了,从而浪费了时间。
而当键盘在高级程序员手上时,他又敲得太快,初级程序员跟不上高级程序员的思路。几分钟后,初级程序员就迷失在代码上下文里了。
只有当高级程序员慢下来,向初级程序员解释清楚他的做法,这种设定才合理。然而,这就不是我们所说的结对编程了,而是一种学习的环节,其中高级程序员在教初级程序员如何解决特定问题。
但是,如果两个开发者都在同一水平,在这种设定下,他们所能取得的进展是令人惊讶的。其中有一个很大的好处是,两个开发者能相互激励,当其中一位失去注意力时,另一位开发者能把他拉回正轨。
总结一下:结对编程适用于两个有相似经验水平的开发者处理复杂的业务问题的情况。
类型2:同步的代码审查
第二种类型是同步的代码审查。这种是,一个开发者独自编写代码,当她写完代码后,立即找代码审查者进行审查。审查者来到开发者的桌前,看着同一块屏幕,一起审查、讨论和改进代码。
审查者不清楚代码的目标
当审查者不清楚这个任务的目标时,这种代码审查类型会很有效果。它会在这种情况下发生:团队里没有优化会议(refinement sessions),或者sprint计划会议(sprint planning sessions),来预先讨论每一项任务。
此做法通常会导致一个结果:只有特定的开发人员才知道某项任务的需求。
这样的情况下,在代码审查之前,向审查者介绍一下任务的目标是很有帮助的。
期待大量的代码改进
如果代码编写者缺乏经验,写出的代码需要很大的改进,那么同步代码审查也会很有效。
如果一个经验丰富的高级开发者将要对一个很初级的程序员写出的一段代码进行审查,那么,当初级程序员写完代码后就和高级开发者一起改进这段代码,效率是远远高于初级程序员自己一个人看的。
强行切换思路的缺点
但是同步审查有一大缺点,就是它强行切换了审查者的思路。它不仅让审查者感到沮丧,也拖慢了整个团队的效率。
类型3:异步代码审查
然后我们有了第三种类型,异步代码审查。这一类型的审查不是在同一时间、同一块屏幕上完成的,而是异步的。开发者在写完代码后,让这些代码对审查者可见,然后开始她的下一个任务。当审查者有时间了,他会在自己的桌子上按自己的时间表进行代码审查。他而不需要当面和开发者沟通,而是用工具写一些评论。在完成审查后,那些工具会把评论和需要的改动通知给开发者。开发者就会根据评论改进代码,同样的,是以自己的时间表来做这些事情。
这个循环,会以代码改动再次被提交到审查者这里而又重新开始。开发者修改代码,直到没有评论说需要改进。最后,改动得到同意,并提交到主分支(master branch)。
你可以看到,同步的代码审查和异步的代码审查相比有很大的不同。
没有直接的依赖
异步代码审查的一大好处, 就是它是异步发生的。开发者不需要直接依赖于审查者,并且他们都可以按自己的时间表去做各自的工作。
多次审查循环的缺点
这里的缺点就是,你可能会有许多次循环的审查,它们可能会持续好几天,直到最终被接受。
当开发者完成代码后,通常需要几个小时,审查者才开始做代码审查。很多时候,审查者给出的建议只有在第二天才能被开发者修复。
这样,第一次审查周期就至少用掉了一天。如果你又多次这样的循环,审查的时间就延续至一整周了——这还不算写代码和测试的时间。
但这里有一些做法,可以避免这样的长时间间隔导致的失控。例如,在我的团队里,我们规定,每天上午,每个开发者在开始做其他工作之前,都要先处理积压的代码审查任务。同样的,在中午午休结束后也需要这样做。
因为在较长的休息时间后,开发者已经不处在他的代码思路中了。这时进行代码审查,你并没有强制它们进行不自然的思路切换,并且能够让代码在合适的时间得到审查。
对比这种代码审查类型的优缺点,我认为,异步的代码审查应该作为每一个专业开发团队的默认选项。
但在我告诉你为什么我是这么想的之前,让我看看第四种代码审查类型。
类型4:偶尔的代码审查
很久以前,我曾经每个月会和整个团队开一次代码审查会议。我们坐在会议室,一个开发者展示并解释着他最近写的一段困难的代码。其他开发者尝试寻找着潜在的缺陷,发表评论,给出如何改进代码的建议。
我不认为任何团队和长期地使用偶尔代码审查的方式。我只想到这个类型适用于的一种情况:当整个团队都没有代码审查的经验时,让把每个人聚起来,一起做代码审查,这样弄几次之后,可能会帮助每个人理解代码审查的目标和意义。
然而,从长远来看,这第四种类型并不是一个合适的技术,因为让全组成员审查一段代码是很低效率的做法。
我应该选择哪种代码审查类型呢?
好了,现在你可能会想,该选哪种类型。我们讨论了正式的类型,它显然不太流行,并且较难用于实践。
然后,我们讨论了轻量级的代码审查这一大类,然后是其中著名的4个子类型。
类型1,瞬时的代码审查,用于结对编程。当两个开发者有相似的技术组合,并且处理一些复杂的业务问题时,这种方式工作得很好。
类型2,同步的代码审查,用于审查者不清楚任务的目标时,需要开发者向其进行解释的这种情况。当开发者经验不足,写出的代码需要大量改进时,这种代码审查模式也工作得很好。
但是它的缺点是需要强行切换思路,会让审查者沮丧,以及拖慢团队开发速度。
类型3,异步的代码审查,避免了强行切换思路带来的问题,对大多数用例都工作得很好。
类型4,偶尔的代码审查,对于专业团队来说不是一个长期的选择。可以只在团队刚刚开始代码审查时被使用。
使用异步代码审查作为默认选择
我认为,专业的团队应该把异步的代码审查作为默认的选择。因为它避免了同步代码审查的缺陷。当审查者不能理解开发者做出一项代码修改的原因时,可以使用同步的代码审查。但在那种情况下,审查者将会去询问开发者,以获得额外的信息和说明。如果你在一个团队中工作,这样的情况应该很少发生。
如果你不在一个真正的团队中,而是和一群人一起工作,那么同步的代码审查就有意义了。如果审查者对你过去这几天的工作内容毫不知情,那么在开始一起做代码审查之前,向审查者给出一个合适的说明是很合理的。
如果你有两个开发者,他们具备相似的技能组合,并且在攻克一个复杂的业务问题,那么也有理由切换到结对编程的模式。但是,一个团队往往由许多经验水平不同的成员组成,并且不会一直都在处理复杂的业务问题。大多数时间,你手上是复杂度在平均水平的常规任务。
因此,专业团队的最佳选择是:使用异步的代码审查作为默认选择,然后当需要时切换到同步的代码审查或者结对编程。
好了,这就是今天的内容。
你的团队使用什么代码审查的类型呢?你知道其他的、我这里漏掉的代码审查类型吗?请在评论里让我知道吧。
下次再聊。保重。
---------------------
作者:powertoolsteam
来源:CSDN
原文:https://blog.csdn.net/powertoolsteam/article/details/81699365
版权声明:本文为博主原创文章,转载请附上博文链接!更多相关内容 -
代码精进之代码规范(二)
2022-03-19 11:04:02代码块内所有的内容都是为了一个目标服务的,不能把无关的内容放在同一个代码块里。同一个代码块里语句的相互联系比与相邻代码块里的语句关系更为紧密; 注意代码块的完整性。代码块是一个完整的信息块。一个代码块...代码整理的关键逻辑
- 一个好的程序员,要识别并且区分代码块,让它们易于阅读和辨认。
程序代码分块时,我们需要注意以下三个点:
- 保持代码块的单一性,一个代码块只能有一个目标。代码块内所有的内容都是为了一个目标服务的,不能把无关的内容放在同一个代码块里。同一个代码块里语句的相互联系比与相邻代码块里的语句关系更为紧密;
- 注意代码块的完整性。代码块是一个完整的信息块。一个代码块要表达一个相对完整的意思,不能一个意思没说完就分块了,就像话说了半句一样;
- 代码块数量要适当。代码块过多,会让人觉得路径太长,逻辑复杂,不容易阅读理解。一个基础的代码块最好不要超过 25 行(通常显示屏小半个页面),否则就会有增加阅读理解的困难。
给代码分块的办法之一,就是有效地使用空白空间。
- 同级别代码块靠左对齐:阅读的习惯顺序是从左到右,代码也如此。因此不同行,但同级别的代码要靠左对齐。
- 同级别代码块空行分割:阅读代码总是从上往下读,不同行的同级别的代码块之间,要使用空行分割。
- 下一级代码块向右缩进:区分不同行的不同级别的代码,可以使用缩进。缩进的目的是为了让我们更直观地看到缩进线,从而意识到代码之间的关系。
- 同行内代码块空格区隔:位于同一行内的代码块,同样需要注意。我们可以使用空格区分开不同的逻辑单元。
- 比如逗号分隔符后要使用空格,以区分开下一个信息。
- 双目运算符或者多目运算符,运算符前后都要使用空格。
一个重要的原则是,每一行代码仅仅表示一个行为。这样每一行的代码才是一个常规大小的、可以识别的基础信息块。
代码分块的基本思想,同样适用于换行。基本的换行规范需要考虑以下三点
- 每行代码字符数的限制。一般情况下,每行代码不要超出 80 个字符( 80 个字符是传统终端的宽度,比如 vi 编译器)。由于屏幕尺寸和代码阅读终端的变化,现在的很多规范,开始使用 120 个字符的限制。所以我们编码的时候,需要留意一下;
- 如果一行不足以容纳一个表达式,就需要换行;
- 一般的换行原则包括以下五点。
- 在逗号后换行。
- 在操作符前换行。
- 高级别的换行优先。
- 新的换行与上一行同级别表达式的开头对齐。
- 如果上述规则导致代码混乱或者代码太靠右,使用 8 个空格作为缩进(两个缩进单位)。
写好注释
几种常见注释类型
- 第一种类型,是记录源代码版权和授权的,一般放在每一个源文件的开头,说明源代码的版权所有者,以及授权使用的许可方式,或者其他的公共信息。
- 第二种类型,是用来生成用户文档的,比如 Java Doc。 这部分的作用,是用来生成独立的、不包含源代码的文档。 这些文档帮助使用者了解软件的功能和细节,主要面向的是该软件的使用者,而不是该软件的开发者。 比如 Java 的 API 规范的文档。
- 第三种类型,是用来解释源代码的。换句话说,就是帮助代码的阅读者理解代码。这是大家默认的注释类型。
三种风格的注释
- 针对第一种注释类型,也就是固定的版权和授权信息,使用一般的星号注释符(/-/)。注释块的首行和尾行只使用星号注释符,中间行以缩进一个空格的星号开始,文字和星号之间使用一个空格。注释的每行长度限制,和代码块的每行长度限制保持一致。
- 针对第二种注释类型,即生成用户文档的注释,使用 Javadoc 要求的格式,文档注释符(/-*/)。 除了首行使用特殊的文档注释符(/),其他的格式和第一种风格保持一致。
- 针对第三种注释类型,也就是代码解释注释,只使用行注释符(//)。 每行长度限制,和代码块的每行长度限制保持一致。
Code Tells You How, Comments Tell You Why.
写好声明的“八项纪律”
取一个好名字
- 既然是标识符,就涉及到取名字的问题。
一行一个声明
- 不推荐在同一行里声明多个变量,即使这一行很短。
- 不要在同一行声明不同类型的标识符。
- 表示数组的中括号“[]”是类型的一部分,而不是标识符的一部分。无论是 Java 语言,还是在 C 语言的代码中,都建议把数组符号放在类型该在的地方。
局部变量需要时再声明
- 标识符的声明应该和它的使用尽可能地靠近,特别是局部变量的标识符声明。这样在视觉上,标识符的定义和使用,可以方便我们阅读和记忆。
类属性要集中声明
- 同样是为了阅读和记忆,类变量的声明则要集中。因为类变量无论是私密变量,还是公开变量,在类的方法实现中,随时都可以调用。我们需要把这些变量放在一起,以便于修改和查找。
声明时就初始化
- 除非变量的初始值依赖于更多的条件,或者涉及到一定的计算,否则,声明时就应该完成初始化。声明时初始化,可以防止初始化的遗漏或者不必要的代码重复。
尾随的花括号
- 一般来说,类声明和方法声明后,要使用花括号把实现的代码包括进来。花括号的使用语法很随意。我不建议代码中混杂地使用不同的格式。推荐一种方法:
- 左括号不要单独成行,要紧随在语句尾部,以一个空格隔开;
- 右括号单独一行。
靠紧的小括号
- 小括号的使用语法也可以很随意。小括号一般用来识别一个标识符是不是方法标识符,所以建议小括号要紧靠着标识符,中间不要有空格。
搜索优化的换行
- 搜索优化是我们编写代码时要考虑的一个因素。搜索优化既包括针对搜索引擎的优化(SEO),也包括针对编辑器(vi, Netbeans)以及系统工具(grep)的搜索优化。
- 这些常用的搜索模式给了我们一个很好的启示:语义相关的词语,常见的搜索模式,要尽量放在用一行。
Java注解
Java 注解是 Java 1.5 引入的一个工具,类似于给代码贴个标签,通过注解可以为代码添加标签信息。这些标签信息可以添加在字段、方法和类上。开发工具、部署工具或者运行类库,可以对这些标签信息进行特殊的处理,从而获得更丰富的功能。注解已经成了 Java 生态系统一个非常重要的技术。使用注解可以大幅度降低我们的开发强度,提高工作效率,减少潜在的错误。像 Java 类库一样,注解也有了越来越丰富的定义和规范,成了我们需要掌握的重要技术之一。
- 这里只讨论编写规范的代码时,该怎么合理地使用注解,具体就是 Override、Deprecated、SuppressWarnings 这三个注解。更详细的 Java 注解技术和规范,以及如何自定义注解,需要你参考相关的文档。
你知道的越多,你不知道的越多。
-
网络安全之恶意代码
2022-01-17 22:01:29恶意代码是一种有害的计算机代码或 web 脚本,其设计目的是创建系统漏洞,并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。恶意代码不仅使企业和用户蒙受了巨大的经济损失,而且...恶意代码是一种有害的计算机代码或 web 脚本,其设计目的是创建系统漏洞,并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。恶意代码不仅使企业和用户蒙受了巨大的经济损失,而且使国家的安全面临着严重威胁。1991年的海湾战争是美国第一次公开在实战中使用恶意代码攻击技术取得重大军事利益,从此恶意代码攻击成为信息战、网络战最重要的入侵手段之一。恶意代码问题无论从政治上、经济上、还是军事上,都成为信息安全面临的首要问题。让我们一起来认识一下恶意代码。
一、什么是恶意代码
恶意代码(Unwanted Code)是指故意编制或设置的、对网络或系统会产生威胁或潜在威胁的计算机代码。最常见的恶意代码有计算机病毒(简称病毒)、特洛伊木马(简称木马)、计算机蠕虫(简称蠕虫)、后门、逻辑炸弹等。
二、恶意代码的分类
1、恶意代码分类
恶意代码的分类标准主要是代码的独立性和自我复制性,独立的恶意代码是指具备一个完整程序所应该具有的全部功能功能,能够独立传播、运行的恶意代码,这样的恶意代码不需要寄宿在另一个程序中。非独立恶意代码只是一段代码,必须嵌入某个完整的程序中,作为该程序的一个组成部分进行传播和运行。对于非独立恶意代码,自我复制过程就是将自身嵌入宿主程序的过程,这个过程也称为感染宿主程序的过程。对于独立恶意代码,自我复制过程就是将自身传播给其他系统的过程。不具有自我复制能力的恶意代码必须借助其他媒介进行传播。
分类:类别 实例 具有自我复制能力的依附性恶意代码 主要代表是病毒 具有自我复制能力的独立性恶意代码 主要代表是蠕虫 不具有自我复制能力的依附性恶意代码 主要代表是后门 不具有自我复制能力的独立性恶意代码 主要代表是木马 2、不同恶意代码的区别
病毒侧重于破坏系统和程序的能力
木马侧重于窃取敏感信息的能力
蠕虫侧重于网络中的自我复制能力和自我传染能力病毒 木马 蠕虫 存在形式 寄生 独立文件 独立文件 传染途径 通过宿主程序运行 植入目标主机 系统漏洞 传染速度 慢 最慢 快 攻击目标 本地文件 文件、网络主机 存在漏洞的网络程序 触发机制 攻击者指定条件 自启动 自动攻击有漏洞的程序 防范方法 从宿主文件中清除 清除启动项和木马服务程序 更新安全补丁 对抗主体 用户,反病毒软件 用户、管理员、反病毒软件 应用程序供应商、用户和管理员 三、恶意代码基本技术
1、隐蔽技术
(1)本地隐藏
防止本地系统管理人员觉察而采取的隐蔽手段。
- 文件隐蔽:将恶意代码的文件命名为与系统的合法程序文件名相似的名称,或者干脆取而代之,或者将恶意代码文件附加到合法程序文件中。
- 进程隐蔽:附着或替换系统进程,使恶意代码以合法服务的身份运行,从而隐蔽恶意代码。还可以通过修改进程列表程序,修改命令行参数使恶意代码进程的信息无法查询。也可以借助RootKit 技术实现进程隐蔽。
- 网络连接隐蔽:借用现有服务的端口实现网络连接隐蔽,如使用80端口,攻击者在自己的数据包设置特殊标识,通过标识识别连接信息,未标识的WWW 服务网络包仍转交给原服务程序处理。
- 编译器隐蔽:由编译器在对程序代码进行编译时植入恶意代码,从而实现恶意代码在用户程序中的隐藏和原始分发攻击。恶意代码的植入者是编译器开发人员。
- RootKit隐蔽:利用适当的Rootkit工具,可以很好的隐蔽自身或指定的文件、进程和网络连接等,很难被管理员发现。
(2)网络隐藏
网络隐藏主要是指通信内容和传输通道的隐藏。
- 通信内容隐蔽:使用加密算法对所传输的内容进行加密能够隐蔽通信内容。
- 传输通道隐藏:利用隐蔽通道技术,实现对传输通道的隐蔽。(隐蔽通道(Covert Channel)是一个不受安全机制控制的、利用共享资源作为通信通路的信息流。包括有:存储隐蔽通道和时间隐蔽通道。)
2、生存技术
恶意代码的生存技术主要包括四种类型:
- 反跟踪技术:通过提高恶意代码分析难度,减少被发现的可能性
- 加密技术:利用加密技术,提高恶意代码自身保护能力
模糊变换技术:利用模糊变换技术,恶意代码可以躲避基于特征码的恶意代码检测系统,提高生存能力 - 自动生产技术:利用自动生成技术,在已有的恶意代码的基础上自动生成特征码不断变化的新的恶意代码,从而躲避基于特征码的恶意代码检测。
3、攻击技术
- 进程注入技术:恶意代码程序将自身嵌入到操作系统和网络系统的服务程序中,不但实现了自身的隐藏,而且还能随着服务的加载而启动。
- 三线程技术:恶意代码进程同时开启三个线程,其中一个为主线程,负责远程控制的工作。另外两个辅助线程分别是监视和守护线程。一旦发现主线程被删除,则立即设法恢复。
- 端口复用技术:重复利用系统或网络服务打开的端口(如80端口),可以欺骗防火墙,具有很强的欺骗性。
- 超级管理技术:恶意代码采用超级管理技术对反恶意代码软件系统进行攻击,使其无法正常运行。
- 端口反向连接技术:指使恶意代码的服务端(被控制端)主动连接客户端(控制端)的技术。
- 缓冲区溢出技术:恶意代码利用系统和网络服务的安全漏洞植入并且执行攻击代码,造成缓冲区溢出,从而获得被攻击主机的控制权。
三、恶意代码传播方式及防范手段
1、传播方式
传播途径
- 利用操作系统和应用软件的漏洞进行传播
- 通过网站传播
在网页上挂载恶意代码
如:主机流览该网页时,恶意代码会自动下载到主机执行。
将恶意代码与正常应用软件捆绑
如:主机下载正常软件运行时,恶意代码也随之自动运行。 - 利用移动媒介传播
如:主机访问U盘和硬盘时,恶意代码可以自动执行。 - 利用用户之间的信任关系传播
如:冒充用户发送虚假链接、图片、邮件等。
总的来说,恶意代码的传播是因为用户的软件出现了漏洞、操作不慎或者是两者的结合造成。
(1)病毒。病毒具备有自我复制能力,一般嵌入主机的程序中。当被感染文件执行操作,如,用户打开一个可执行文件时,病毒就会自我繁殖。病毒一般都具有破坏性。
(2)木马。这种程序从表面上看没有危害,但实际上却隐含着恶意的意图和破坏的作用。一些木马程序会通过覆盖系统中已经存在的文件的方式存在于系统之中;另外有的还会以软件的形式出现,因为它一般是以一个正常的应用程序身份在系统中运行的,所以这种程序通常不容易被发现。
(3)蠕虫。蠕虫是一种可以自我复制的完全独立的程序,它的传播不需要借助被感染主机中的程序和用户的操作,而是通过系统存在的漏洞和设置的不安全性来进行入侵,如通过共享的设置来侵入。蠕虫可以自动创建与它的功能完全相同的副本,并能在无人干涉的情况下自动运行,大量地复制占用计算机的空间,使计算机的运行缓慢甚至瘫痪。2、攻击机制
恶意代码的行为表现各异,破坏程度千差万别,但基本作用机制大体相同,其整个作用过程分为6个部分。
(1)侵入系统。侵入系统是而已代码实现其恶意目的的必要条件。恶意代码入侵的途径很多,包括前面传播方式的各种途径。如:从互联网下载的程序本身就可能含有而已代码;接收已感染恶意代码的电子邮件;从光盘或U盘往系统上安装软件;黑客或者攻击者故意将恶意代码植入系统等。
(2)维持或提升权限。恶意代码的传播与破坏必须盗用用户或者进程的合法权限才能完成。
(3)隐蔽策略。为了不让系统发现恶意代码已经侵入系统,恶意代码可能会改名、删除源文件或者修改系统的安全策略来隐藏自己。
(4)潜伏。恶意代码侵入系统后,等待一定的条件,并具有足够的权限时,就发作并进行破坏活动。
(5)破坏。恶意代码本质具有破坏性,其目的是造成信息丢失,泄密,破坏系统完整性等。
(6)重复(1)至(5)对新的目标实施攻击过程。
3、防范手段
通用恶意代码检测技术包括静态和动态检测技术:
- 基于特征的扫描技术
建立恶意代码的特征文件,在扫描时根据特征进行匹配查找 - 校验和法
对需要监控的文件生成校验,周期性的生成新校验和并与原始值比较 - 沙箱技术
根据程序需要的资源和拥有的权限建立运行沙箱,可以安全地检测和分析程序行为 - 基于蜜罐的检测技术
将主机伪装为运行着脆弱的服务或系统,同时安装强大的监测系统。
其中基于特征的扫描技术和校验和法是静态检测技术,沙箱技术和基于蜜罐的检测技术属于动态检测技术。
四、常见恶意代码
参考文献:
《网络攻防技术与实战 深入理解信息安全防护体系》 郭帆
《恶意代码及其防御》知乎 Drifter
《恶意代码》MBA智库百科 -
项目代码优化:使用Java枚举常量代替类常量
2017-08-10 20:51:57项目代码优化:每页显示商品记录数在代码中原来是定义的一个类常量,因为在代码中多次使用到,因此在这个实现类中定义了一个类常量。使用和这样的代码运行是没有任何问题的,但是对于以后的代码维护和程序的灵活扩展...项目代码优化:
每页显示商品记录数在代码中原来是定义的一个类常量,因为在代码中多次使用到,因此在这个实现类中定义了一个类常量。
使用
和
这样的代码运行是没有任何问题的,但是对于以后的代码维护和程序的灵活扩展都是不好的,就算是定义了类常量,也是属于硬编码问题。这里我们可以使用Java推荐使用的枚举。那么Java枚举是怎么使用的呢?学习C++的时候使用过,但是Java没有怎么使用过,有些遗忘,C++和Java中的枚举还是比较相似的,先来看看Java枚举的基本使用Java 语言中定义枚举也是使用关键字enum
上述定义了一个枚举类型 Color(可以说是类,因为代码编译之后是Color.class字节码文件,这个和接口还是蛮相似的).上面的定义,还可以改成下面的这种形式
其实,枚举的成员就是枚举对象,只不过他们是 静态常量 而已。使用javap命令(javap 文件名<没有后缀.class>)可以反编译 class 文件使用CMD先编译这个Java源文件Color.java,再使用javap Color命令反编译:
我们可以使用普通类或者接口来模拟枚举,下面定义一个Color类。
对比一下,就明白了,如果按照这个逻辑,是否还可以为其添加另外的构造方法?答案是肯定的!
为Color声明了两个成员变量,并为其构造带参数的构造器。如果你这样创建一个枚举是错误的。
对于类来讲,最好将其成员变量私有化,然后,为成员变量提供 get、set 方法。按照这个原则,可以进一步写好枚举Color.
但是,java设计enum的目的是提供一组常量,方便用户设计。如果我们冒然的提供set方法(外界可以改变其成员属性),好像是有点违背了设计的初衷。那么,我们应该舍弃set方法,保留get方法。
普通类,我们可以将其实例化,那么,能否实例化枚举呢?在回答这个问题之前,先来看看,编译之后的Color.class 文件
可以看出,编译器为其构造方法加上了private,那么也就是说,我们无法实例化枚举。所有枚举类都继承了Enum类的方法,这点可以从反编译出来的源码看到 ,包括toString 、equals、hashcode 等方法。因为equals、hashcode方法是被final修饰的,所以不可以被枚举重写(只可以继承)。
但是,可以重写toString方法。
我们可以看一下Enum源码
对于枚举的使用可以看考博客:
Java 枚举(enum) 详解7种常见的用法
地址:http://blog.csdn.net/qq_27093465/article/details/52180865对于定义的枚举Color,简单测试一下:
结果:
具体应用:定义枚举
使用枚举
和
-
微信小程序开发(一):小程序代码构成
2022-03-21 11:02:06通过开发工具创建一个项目后,在项目目录中自动生成里四种不同类型的文件 JSON配置 1、JSON是一种数据格式,在小程序中的作用主要是保存一些静态配置 2、JSON文件中不能使用注释 小程序配置app.json 当前小程序的... -
毕业前写了20万行代码,让我从成为同学眼里的面霸
2021-05-10 07:32:1520万行代码写完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这个毕业的时间点参加,就会显得特别匆忙。因为你的压力既来自于... -
4.5(Java)设计一个名为Stock的类表示股票,该类包括;
2020-10-10 19:31:24设计一个名为Stock的类表示股票,该类包括; .一个名为symbol的字符串数据域表示股票代码: .一个名为name的字符串域表示股票名称; .一个名为 currentPrice 的double型数据域,用来存储股票的当前价格; .一个名为 ... -
SpringBootCodeGenerator基于SpringBoot的代码生成器项目
2018-09-15 22:41:01- √ 基于`SpringBoot2+Freemarker+Bootstrap` ...- √ 用`DDL-SQL`语句生成`JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL`相关代码. - √ github仓库:[https://github.com/moshowgame/SpringBootCodeGenerator/] -
基于google升级版c++代码规范指南
2021-11-11 00:09:54有些团队所有成员写的代码都一致,10个人写的代码像1个人写的。正因为有代码规范,使得代码可读性强,方便代码review,利于后期维护。这体现了代码规范的重要性。接下来,在参考google的代码规范基础上,详细列举... -
阿里推出一款低代码平台,开源了
2022-03-14 17:06:49最近的阿里的一款低代码开发平台又上了 Github 热榜。 为什么说又一款呢? 类似的低代码平台已经很多了,阿里现在还要开源了这个平台。 截止目前,该项目虽然上了Github 热榜,但是获得的 Star 并不多。 项目初期,... -
代码Review那些事
2016-04-27 20:18:19代码Review那些事 -
一文讲透低代码
2022-05-15 23:23:32目录一、了解低代码开发平台1、低代码的定义与发展二、低代码的特点三、低代码的技术路线1、行业观点2、低代码的技术路线四、低代码开发者有哪些五、低代码赋能业务人员六、低代码对业务开发者的价值七、低代码的... -
静态代码分析工具列表分析---代码分析工具列表(30款工具)
2017-09-07 19:07:58本文是一个静态代码分析工具的清单,共有30个工具。包括4个.NET工具、2个Ada工具、7个C++工具、4个Java工具、2个JavaScript工具、1个Opa工具、2个Packaging工具、3个Perl工具、1个Python工具、1个嵌入式工具、2个二... -
重新认识java(六) ---- java中的另类:static关键字(附代码块知识)
2017-01-28 20:55:39与c++不同的是,在java中,不能在方法体中定义static变量,我们之前所说的变量,都是类变量,不包括方法内部的变量。 那么,静态变量有什么用途呢? 静态变量的用法 最开始的代码中有一个静态变量 — ... -
从“玩具”到“工具”,低代码能否完全替换纯代码?
2021-05-11 18:01:59这两年,低代码市场的繁荣终于从美国走到了中国,在需求市场、资本市场双轮驱动下,给企业客户带来空前的价值。同时,新的产品和公司,抑或“新瓶装老酒”的公司层出不穷、眼花缭乱,同时也给企业服务领域的从业者... -
代码统计工具实测点评
2016-09-26 16:52:07通过简单的几部操作,就能准确的统计出一个项目的代码行数、注释行、空白行、代码行、总行数、注释率、空白率、字符数等一系列详细的统计信息。 -
MATLAB/Simulink自动代码生成(一)
2019-02-27 19:29:32Simulink自带了种类繁多、功能强大的模块库,在基于模型设计的开发流程下,Simulink不仅通过仿真可以进行早期设计的验证,还可以生成C/C++、PLC等代码直接应用于PC、MCU、DSP等平台。在嵌入式软件开发中发挥着... -
前端低代码调研与总结
2022-01-21 14:47:48近些年来,低代码的概念逐渐流行了起来,而低代码产品也越来越多的出现在我们的身边。低代码可以叫做可视化搭建,或者叫效能工具等等。...还有电商类的公司都会给商家提供一个类似店铺装修的工具,小程序生产工具 -
《代码整洁之道》读书笔记
2015-04-10 15:52:23《代码整洁之道》是Bob大叔神一样的作品,这本书从引言到附录都无比精彩,书中的插图也非常好,代码是用Java语言书写的,程序员尤其是Java程序员赶紧去阅读吧! -
C++代码静态检测
2019-01-18 23:42:49C++代码静态检测一,CppCheck(下载地址:http://cppcheck.net/)1,使用CppCheck客户端检测2,在vs中使用CppCheck二,TscanCode(下载地址:https://github.com/Tencent/TscanCode)三,PVS-studio(下载地址:... -
Java代码是怎么运行的?
2018-11-06 00:52:56极客时间《深入拆解Java虚拟机》...Java 代码有很多种不同的运行方式,比如在开发工具中运行、双击执行 jar 文件运行、在命令行中运行,甚至可以在网页中运行。 Java 的运行离不开 JRE(Java 运行时环境), JRE ... -
构建高质量的C#代码 完整扫描版
2014-06-04 12:24:48《构建高质量的C#代码》主要内容包括C#的基本语法、结构与应用特点,常用开发资源与技术要点,设计模式在C#中的应用等,以及特别重要的一点,即我们应该养成良好的开发习惯,不仅要注重技术细节,还要从更宽阔的视野... -
关于Win10系统无法安装.NET Framework 3.5(包括.NET 2.0 和 3.0) 错误代码:0x800F0950
2019-12-09 14:45:18关于Win10系统无法安装.NET Framework 3.5(包括.NET 2.0 和 3.0) 关于 错误代码:0x800F0950 2019-06-13 00:07:08LarryPage007阅读数 4668收藏收起 分类专栏:笔记 版权声明:本文为博主原创文章,遵循CC 4.0 BY-... -
【代码规范】常见注释规范
2018-06-21 15:10:501.在有处理逻辑的代码中,源程序有效注释量必须在20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 2.文件注释:文件注释写入... -
设计一个类Student,该类包括姓名、学号和成绩。
2020-06-14 17:29:1210、设计一个类Student,该类包括姓名、学号和成绩。设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息 算法分析: 1、定义一个类,包含私有属性 姓名 学号 成绩 2、实现构造函数和get()/set() 方法 3... -
Simulink学习笔记(二)——Simulink自动代码生成(一)
2018-06-21 10:36:53前言: Simulink自带了种类繁多、功能强大的模块库,在基于模型设计的开发流程下,Simulink不仅通过仿真可以进行早期设计的验证,还可以生成C/C++、PLC等...一、根据需求建立系统框图 低通滤波:又叫一阶惯性... -
静态代码分析学习
2018-03-28 09:25:55背景 软件开发过程中,工程师需要花费大量的时间和精力修改代码缺陷。从下图可以看出,在软件开发过程中,测试成本随着... 【代码[静态分析](Program Static Analysis)是指在不运行代码的方式下,通过词法分析... -
Java—重复调用的代码块—方法
2020-07-31 15:30:07在本质上,一个类描述了两件事情。⑴ 一个对象知道什么(what’s an object knows)? ⑵ 一个对象能做什么(what’san object does)?第1件事情对应于对象的属性(或状态)。第2件事情对应于对象的行为(或方法) ... -
代码覆盖率
2018-11-28 17:15:35代码覆盖率指我们运行所有项目中的测试方法后,能够执行的语句和...所以,覆盖率理论上来说越高越好,代码覆盖率高说明我们的每一段代码都经过了测试,得到了预期的答案。但我们也不应该太纠结于代码覆盖率的高低,... -
35个Java代码优化的细节,推荐
2020-06-23 14:59:14前言 代码 优化 ,一个很重要的课题。...但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。 代码优化的目标是: 减小