前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何判断一个程序员是真的“菜”,还是他在写“防御性代码”?

如何判断一个程序员是真的“菜”,还是他在写“防御性代码”?

作者头像
数据猿
发布于 2024-02-23 11:24:11
发布于 2024-02-23 11:24:11
1750
举报
文章被收录于专栏:数据猿数据猿

大数据产业创新服务媒体

——聚焦数据 · 改变商业


近期,互联网、软件领域普遍在进行较大规模裁员,在这种情况下,业界流传着一种说法,有些程序员在写“防御性代码”,来增加自己的谈判筹码。

那么,什么是防御性代码,怎么区分防御性代码,会带来哪些问题?这篇文章来分析一下这些问题。

防御性代码可以分为被动型和主动型

防御性代码,在传统意义上,指的是程序员编写的那些旨在处理程序中,可能出现的各种异常情况的代码。这种代码的目的,是使程序能够在遇到意外输入或环境变化时,仍然能够稳定运行,从而提高软件的鲁棒性和可靠性。例如,对用户输入进行验证、处理外部系统返回的错误数据等。这种防御性编程是一种良好的编程实践,被广泛推崇。

然而,近年来,特别是在技术行业裁员频繁的背景下,防御性代码的概念被扩展并赋予了新的含义。一些程序员开始编写代码,不仅仅是为了处理异常情况,而是为了在其被潜在裁员的情况下,增加自己的不可替代性,或者在离职后留下隐患,使得公司需要重新聘请他们来解决问题,这种做法引发了业界的广泛关注和争议。

具体来看,防御性代码可以大致分为两类:被动型和主动防御性代码。

被动型防御性代码,包括那些增加代码复杂性和维护难度的做法,目的是使得除了原作者外,几乎没有人能够轻易理解和修改这些代码。典型的被动型防御代码包括:

复杂代码:故意编写难以理解的代码,增加了其他开发人员的学习成本。

文档缺失:故意不提供或提供不完整的文档,使得代码的功能和设计理念难以被他人把握。

个人依赖代码:编写高度个性化的代码,使其维护和理解高度依赖于原作者。

性能降低代码:故意使用低效的算法或设计,使得性能优化变得困难,仅原作者能够“优化”。

日志混淆:故意使错误日志难以理解,增加问题诊断的难度。

主动防御性代码,则是那些被设计来在特定条件下激活,直接导致系统故障或数据损坏的代码。这类代码的存在通常带有明显的恶意,包括:

时间炸弹:预设时间触发的代码,可能会在特定时间导致系统崩溃或功能失效。

逻辑炸弹:当系统满足特定的逻辑条件时触发,如特定用户操作或数据达到某个状态。

隐藏后门:允许原作者在未经授权的情况下远程访问系统。

数据污染:故意编写的代码逐步破坏数据质量,可能长时间不被发现。

被动型防御性代码的问题在于,它们往往藏匿在看似正常的开发实践之下,难以被直接识别为恶意行为,而主动防御性代码则因其潜在的破坏性,而更容易被界定为恶意代码。

在技术日益成为企业核心竞争力的今天,理解和区分这两类防御性代码的区别,对于维护企业的软件质量和工作环境至关重要。

怎么识别出防御性代码?

在探讨防御性代码的世界里,我们面临着一个棘手的问题:如何区分一个程序员是因为技术能力不足,而写出了难以理解或维护的代码,还是故意为之,以增加自己的不可替代性?这个问题的答案并不简单,因为它触及到了编码技能、意图和项目管理等多个层面。

我们先来看看被动型防御性代码,这类代码的特点通常是过分复杂、缺乏文档、高度个性化,以及过度依赖特定编码风格或技术。在面对这样的代码时,区分它是出于故意设计还是技术不足的结果变得颇为困难。识别这种区别,通常需要深入了解程序员的工作历史、代码编写习惯,以及他们与团队的互动方式。

一名程序员如果历史上持续提交难以理解或维护的代码,且没有相应的改进努力或团队合作的证据,这可能暗示着他们故意采用这种做法,以增加自己的不可替代性。相反,如果这名程序员在其他方面表现出积极的学习态度、愿意接受反馈并改进代码质量,那么代码的复杂性或质量问题可能更多是能力和经验的限制所致。

此外,他们与团队成员的互动方式也能提供重要线索:如果他们积极寻求帮助、愿意共享知识和技术经验,那么可能就不是有意编写防御性代码。因此,管理者和团队领导需要综合考虑这些因素,以公正和准确地评估情况。

相对而言,主动防御性代码往往有一些更明显的标志,比如,代码中含有特定的触发条件,这些条件很少或根本不会在正常的业务流程中出现。或者,某些代码片段被隐藏或伪装得很隐蔽,显得毫无意义或与项目无关,但实际上含有潜在的破坏性操作。识别这类代码相对容易一些,因为它们通常需要特意设计并隐藏,以避免在常规的代码审查过程中被发现。

为了更好的理解防御性代码,让我们来看一个具体的例子。

想象一下,你是一家软件公司的项目经理,在进行代码审查时,你遇到了一段异常复杂的代码。这段代码是由一名资深程序员编写的,处理一个本应相对简单的任务——比如,用户登录验证。但是,这段代码使用了过分复杂的逻辑,涉及多层条件判断和对多个外部服务的调用,而且几乎没有任何注释来解释这些逻辑是如何工作的。

进一步的调查显示,这段代码中含有一些“隐藏的逻辑”,在特定条件下才会触发。例如,如果用户的登录尝试恰好在午夜12点发生,这段代码会引入一个额外的延迟,导致登录过程异常缓慢。这种情况在正常的测试中很难被发现,因为它需要特定的时间条件才会触发。

此外,代码中还包含了一些看似无关紧要的函数调用,这些调用对于完成登录验证来说并不是必需的。在深入分析这些函数后,你发现它们实际上是设置了一系列的“后门”,允许这名程序员在没有正确凭证的情况下,通过一些特殊的方法绕过正常的登录流程。

在这个例子中,这名程序员故意编写了复杂和难以理解的代码,不仅使得他成为了维护这部分代码的唯一人选(因为只有他能够理解这些复杂的逻辑),而且还暗中留下了潜在的风险,这些风险在他离职后可能导致严重的安全问题。这是一个典型的“防御性代码”例子,其中包含了被动型防御性代码(复杂的逻辑和缺乏文档)和主动防御性代码(特定条件下的异常行为和隐藏的后门)的元素。

写防御性代码是有法律风险的

在探讨程序员编写防御性代码的背景下,法律风险和责任成为了一个重要的议题。这些风险和责任在被动型和主动防御性代码之间存在显著差异,主要体现在故意行为与能力不足之间的界限,以及可能违反的职业道德和合同条款上。

对于被动型防御性代码,法律风险主要涉及到程序员的职业道德和合同义务。如果程序员的行为被解释为有意为之,以增加自身的不可替代性,这可能构成对雇主的欺诈行为,违反了职业道德和合同中的诚信义务。然而,由于直接证据往往难以获得,这种情况下的法律责任往往处于灰色地带,难以明确界定。

相比之下,主动防御性代码的法律风险则更加明显和严重。编写旨在未来某个时间点故意损害公司系统或数据的代码,如时间炸弹、逻辑炸弹或隐藏后门,这些行为可以被明确视为违法行为。这不仅违反了职业道德,更可能触犯刑法,如破坏计算机系统、非法访问计算机信息系统等罪名。此外,如果这种行为导致了实际的损失,程序员还可能面临赔偿责任。例如,数据破坏可能违反数据保护法规,而未授权访问则侵犯了计算机安全法律。

从实际操作角度看,主动防御性代码因其具有明确的恶意意图和潜在的破坏性,比被动型防御性代码更容易被识别并追究法律责任。企业和组织在面对这类问题时,通常会通过内部调查、技术审计和法律途径来应对,并寻求补救措施。因此,程序员在考虑编写任何形式的防御性代码之前,必须深思熟虑其可能带来的职业和法律后果。

企业和程序员的相互信任,是解决防御性代码问题的核心

在当前的职场环境中,程序员采取防御性代码作为自我保护手段的做法,虽出于对职业安全的考虑,但这种策略可能并非最佳选择。这种做法本质上是一把双刃剑,短期内或许能为个人带来某种程度的“保护”,但长远来看,其副作用和潜在的负面影响远超过可能的好处。

这种行为损害了程序员作为专业人士的核心价值和职业道德,进而影响个人的职业信誉。在技术行业,一个人的职业生涯极大地依赖于他们的专业声誉和同事、雇主之间建立的信任。一旦失去了这种信任,恢复将极其困难,可能导致个人在行业内的机会大大减少。

从法律角度来看,故意编写可能导致损害的代码,不仅存在道德问题,还可能涉及违法行为,从而使个人面临法律诉讼或其他法律后果,包括被解雇、诉讼甚至刑事责任,尤其是那些故意植入破坏性功能的情况。

防御性代码,尤其是那种被设计来隐藏缺陷、故意降低代码可维护性或植入潜在的破坏性功能的代码,对企业、个人以及整个社会都有深远的影响。

在企业层面,防御性代码可能导致系统的不稳定,增加维护成本,甚至在未检测到的情况下引发重大故障或数据泄露,对企业的运营和声誉造成严重影响。这种代码的存在反映出团队内部的不信任和沟通不畅,可能导致团队分裂,影响员工的士气和生产力。

因而,实施严格的代码审查过程是关键,它可以帮助识别和纠正潜在的问题代码。此外,安全与合规性审计也是确保代码安全性和符合行业标准的有效手段。

当然,更重要的是,企业也需要让员工信任,尤其是在困难时期,不要动辄暴力裁员,甚至侵犯员工利益。即使是裁员,也尽量给予彼此体面,这将大大避免部分程序员编写防御性代码的情况。

文:一蓑烟雨 / 数据猿 责编:凝视深空 / 数据猿

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Android Hook技术防范漫谈
背景 当下,数据就像水、电、空气一样无处不在,说它是“21世纪的生产资料”一点都不夸张,由此带来的是,各行业对于数据的争夺热火朝天。随着互联网和数据的思维深入人心,一些灰色产业悄然兴起,数据贩子、爬虫、外挂软件等等也接踵而来,互联网行业中各公司竞争对手之间不仅业务竞争十分激烈,黑科技的比拼也越发重要。 随着移动互联网的兴起,爬虫和外挂也从单一的网页转向了App,其中利用Android平台下Dalvik模式中的Xposed Installer和Cydia Substrate框架对App的函数进行Hook这一招
美团技术团队
2018/03/13
2.1K0
Android Hook技术防范漫谈
[Android][Security] Android 逆向之 xposed
我当然不会满足于这么一点浅薄的介绍,既然用这个框架了,那就得把这个框架搞清楚对不?
wOw
2020/01/20
2.5K0
安卓反调试|常见的Xposed框架检测手段与突破方式​
原理:当App获取到系统权限的时候,可以获取系统的所有运行中的App的列表,通过列表发现是否存在有Xposed相关的App(通常都是Xposed Installer相关的Apk,例如de.robv.android.xposed.installer)保持运行状态,一旦存在,就表明用户很有可能存在Hook行为。
云爬虫技术研究笔记
2020/03/25
3.8K0
浅谈android hook技术浅谈android hook技术-- coding:utf-8 --print jscode author = 'gaohe'-- coding:utf-8 --pri
您当前的位置: 安全博客 > 技术研究 > 浅谈android hook技术 浅谈android hook技术 2017年03月17日 10:06 1249 前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程。
一个会写诗的程序员
2018/08/20
2K0
万物皆可Hook!重新捡起Hook神器-Xposed框架
而是在程序界流传的强大秘技-Hook函数,Hook原意是指钩子,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技。 在很多技术领域都存在的这种Hook技术,比如下面这些:
云爬虫技术研究笔记
2019/11/05
3.5K0
万物皆可Hook!重新捡起Hook神器-Xposed框架
Xposed 配置,使用以及原理介绍
在搞逆向的时候,Hook是个很必要的手段,通过Hook就可以了解内部的运行机制,甚至进行修改。对于Hook Java方法,用的比较多的就是Xposed,本篇就介绍下Xposed的配置,使用,原理。
一只小虾米
2022/10/25
2.8K0
Xposed 配置,使用以及原理介绍
xposed模块开发流程
xposed是什么: 必须部署在ROOT后的安卓手机上,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对zygote进程及其创建的dalvik虚拟机的劫持。
bosh123
2021/01/07
3.5K0
android hook介绍
第一章:android hook介绍 第二章:hook之替换View.OnClickListener
李小白是一只喵
2021/02/04
8590
Xposed 3.1.5 首战 之 来场劫持用户输入玩玩吧
理解程度还不够,阅读几次也只是有个印象而已,这次再次拷贝一份,以供阅读此文的小伙伴简单阅读一下:
贺biubiu
2019/06/11
8650
eagleget安卓_android startactivityforresult
Android EagleEye官方介绍在 https://github.com/MindMac/AndroidEagleEye/blob/master/README-zh.md
全栈程序员站长
2022/09/22
4630
Xposed去抖音提示
特别感谢https://www.52pojie.cn/thread-684757-1-1.html 官方教程:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
ppjun
2018/09/05
1.6K0
《吐血整理》高级系列教程-吃透Fiddler抓包教程(28)-Fiddler如何抓取Android7.0以上的Https包-下篇
虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作: ① 二次加密 有的APP,在涉及到关键数据通信时,会将正文二次加密后才通过HTTPS发送,我们抓包抓到的是一堆二进制base64 ② 自带HTTP Client 像支付宝那样的变态,自己带了一个基于so的HTTP Client库,对于关键数据,都不走URLConnection和OkHttp,而是走自己的HTTP Client库,甚至一些WebView页面的渲染,都是先用自带的HTTP Client请求得到json数据,然后填到HTML模板里面,再在WebView里渲染出来。 ③ SSL/TLS Pinning,APP自带服务端证书,除了自带证书什么都不信
北京-宏哥
2022/10/28
29.4K0
android 防止反编译的若干方法
第一种方式:混淆策略 混淆策略是每个应用必须增加的一种防护策略,同时他不仅是为了防护,也是为了减小应用安装包的大小,所以他是每个应用发版之前必须要添加的一项功能,现在混淆策略一般有两种: 对代码的
xiangzhihong
2018/02/01
2.7K0
android 防止反编译的若干方法
那些年Android黑科技②:欺骗的艺术
“我的能量无穷无尽,只有强大暗能量才能统治Android界。 受屎吧!!! =≡Σ((( つ•̀ω•́)つ ” -- 来自暗世界android工程师
陈宇明
2020/12/15
8170
那些年Android黑科技②:欺骗的艺术
Android 插件化之Hook机制
Hook 英文翻译过来就是「钩子」的意思,就是在程序执行的过程中去截取其中的信息。Android 操作系统中系统维护着自己的一套事件分发机制,那么Hook就是在事件传送到终点前截获并监控事件的传输。其原理示意图如下:
xiangzhihong
2022/11/30
4120
Android Hook与简单的xposed模块开发实例
Hook是一种在特定事件或操作发生时插入自定义代码的编程技术。在前端开发中,例如Vue和Angular的生命周期钩子,体现了Hook的机制,允许开发者在组件的不同阶段执行代码,提升代码的模块化和可重用性。
阿菇kinoko
2025/01/24
2321
Android Hook与简单的xposed模块开发实例
对运动作弊APP的分析
在网络上获取到一个运动模拟器APP,宣称可以支持对市面上所有运动APP的步数的修改,最终快速实现到你设定的目标步数。
小道安全
2023/10/08
6660
对运动作弊APP的分析
Android逆向分析从入门到深入
学习逆向的初衷是想系统学习Android下的hook技术和工具, 想系统学习Android的hook技术和工具是因为Android移动性能实战这本书. 这本书里用hook技术hook一些关键函数来计算关键函数的调用参数和调用时长, 从而确定性能问题发生的位置和原因. 但目前没有比较系统的讲解hook的书籍, 所以就系统的了解下逆向分析.
用户7118204
2020/03/24
1.3K0
理解 Android Hook 技术以及简单实战
作者:落英坠露 链接:https://www.jianshu.com/p/4f6d20076922 著作权归作者所有,转载请联系作者获得授权。 1. 什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处理,也是根据事件流程一步步地向下执行。而「钩子」的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事
用户1269200
2018/04/19
3.1K0
某风控SDK逆向分析
  国内某知名风控SDK,本地从Java层和Native层收集大量设备信息,上传至服务器后生成设备指纹。SDK混淆非常严重,Java层的字符串加密可以被JEB自动解密,影响不大,但是类名和变量名全是0和O只能硬着头皮看
大A
2023/02/14
3.1K0
某风控SDK逆向分析
相关推荐
Android Hook技术防范漫谈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档