代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

31 | 为什么安全的代码这么重要?

范学雷 2019-03-15
从今天开始,我们进入本专栏的“安全模块”。首先,我们通过一个具体的安全漏洞的案例,来感受下计算机代码是多么的脆弱,以及编写安全的代码为什么如此重要。

评审案例

在 Web 开发中,“multipart/form-data“类型经常被用来上传文件。比如下面这段描述表单的代码,就是使用 multipart/form-data 上传文件的一段 HTML 代码。
<FORM action="http://upload.example.com/"
enctype="multipart/form-data"
method="post">
<P>
Upload the file: <INPUT type="file" name="upload-file"><BR>
<INPUT type="submit" value="Send">
</FORM>
文件上传的操作,会被浏览器解析成类似下面的 HTTP 请求。
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="upload-file"; filename="myfile.txt"
Content-Type: text/plain
... contents of myfile.txt ...
--AaB03x--
Web 服务器接收后,会解析这段请求,然后执行相关的操作。下面的这段代码,是 2017 年 3 月之前 Apache Struts 2 解析“multipart”请求的实现。
其中,蓝色标注的代码,LocalizedTextUtil.findText(),用来查找错误的本地化信息。如果“multipart”请求解析出错,就会触发这个方法。它的规范大致如下:
对于 LocalizedTextUtil.findText() 的规范,我们要留意蓝色字体的部分。这一部分告诉我们,如果信息里包含了 OGNL(Object Graph Navigation Language)的表达式,表达式会被执行。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • 流光奕然
    我是公司产品安全部的
    第一个问题,过期版本一定要尽快升级,刚刚暴露的漏洞,业界往往称为1day漏洞。这种漏洞如果是高危的话会给公司造成极大的损失。比如方面的openssl心脏滴血,造成无数网站的敏感信息泄露。

    第二个问题,这只能依赖我们安全人员及时从各大媒体,安全厂商,主流厂商的官网和美国国家漏洞库搜集cve漏洞。

    第三个问题,一旦发现最新漏洞,往往依赖我们安全人员发布漏洞紧急预警,业界称为sirt,然后通过内部预警系统下发整个公司,每个产品会有相应的产品安全接口人,及时反馈相应影响范围和修复情况。

    作者回复: 谢谢分享。 第三点是很好的经验!反过来,也要有接受漏洞报告的简单、通畅的渠道。

    2019-06-28
    1
  • 天佑
    在美国,包括社会保障号、出生日期在内的信用记录是高度敏感的信息。有了这些信用记录,一个人不用出面,甚至不需要支付一分钱,就可以买车、买房、申请信用卡。
    老师这个属实吗,难道他们不核实下是否是本人?

    作者回复: 属实,美国高度依赖个人的敏感信息和信用记录。中国现在很多事情也可以靠验证类似的敏感信息完成,这就是互联网商业的基础之一啊。

    2019-04-14
    1
  • hua168
    如果升级是最简单,最基础的维护的话,那我只能怎么方便怎么来了,要不然我们一个月都是在升级了😂
    目前想到方法:
    1. 能yum(centos)的绝不源安装!
        优点:升级快,缺点:版本不能退回,
       反正要保持最新,先测试好再升
    2. 能有现成最新版本的docker就直接下,或者有多个客户环境相同的自己制作docker
    3. 与开发沟通能不用插件尽量不用,能用常用的函数尽量用常用,这样就做到升级修改量小,运维升级也方便

    作者回复: 这些都是好办法! 怎么简单,怎么依赖少,怎么稳定就怎么来。

    2019-03-18
    1
  • 天佑
    老师,有没有在打补丁的最佳实践,比如升级后的兼容性,可用性,性能方面的验证,这方面讲不清楚,就不敢打,阻力往往也在这块。

    作者回复: 是的,验证是最大的阻力。其实这类似于给代码打补丁,JDK的办法主要是依靠自动化的回归测试。

    2019-03-17
    1
  • hua168
    老师,像第三方源软件(linux系统)漏洞只能通过升级版本来解决吗?

    比如,我前公司客户是国企偏多,对方购买有安全评估系统,维护多了,就一条“要始终保持最新版本”,几乎每月都要升级nginx、redis、mysql、php等到最新版本,如果不升级对方直接服务器不用我们系统😂,版本跨度大还要重写代码😂调试,有些函数新版本放弃了!我们运维和开发都叫苦,国企钱不好赚…

    能有什么解决方案吗?比如
    1.能不对外开放就尽量不放开,像redis、mysql即使有严重bug,但我不对外,只能本机(再不行就局域网)能访问…
    2.必须对外开放的:统一在前面在一层安全层,访问网站后先统一做安全过滤,安全了再放行请求。

    作者回复: 还有一种方式,是升级版本发布之前,就把漏洞解决掉,特别是已经披露尚未修复的漏洞。不过,这种方式需要更专业的知识,更复杂的操作。一般地,我们没有这个能力掌握这么多的技能。

    短期内,升级到最近的安全修复版就可以了。安全修复版一般会严格地考虑兼容性问题,升级的麻烦相对较小。

    长期看,要升级到最新的版本。 因为老版本的生命周期迟早要结束。早升级早受益,早升级麻烦少。 如果累计好几个版本再升级,那时候的麻烦事更多,更难缠。

    升级版本是最省事最简单的办法,其他的办法都比这个复杂。

    对外不开放看起来是个好思路,不过怎么定义和管理内外,是个天大的麻烦事。比如说,公司外面的人员算不算外?公司的合作伙伴算不算外?财务部算不算外?另外一个研发团队算不算外?一个研发团队里,小李算不算外?不联网的本机是一个独立的个体,可是操作机器的人算不算外?防内奸的复杂度,远远超出我们的想象。

    比如说,机器A不联网,只有公司CEO的账户可以操作机器A的特定功能。 机器A五年没有更新了。 由于机器A存在安全漏洞,几乎每个人都知道该怎么不使用CEO的账户,就可以获得CEO的权限。CEO也知道这个问题,但是就是不升级。有什么办法保持机器A可用还要防止别人使用吗(甚至还要防止CEO使用)?办法是有的。可是,很可能到最后,防内奸的管理制度可能搞得每个人都人心惶惶。一旦内奸没防住(当然防不住),人人都可能是受害者。

    前置一个安全层,能起到的作用很小。很多代码的错误,攻击可以通过正常的业务逻辑和数据进行,前置的安全层在理论上,是不可能阻断这样的攻击的。

    升级是最简单、最基本的运维,一定要做到,不要在这方面妥协。

    2019-03-16
    1
收起评论
5
返回
顶部