有 a - b < c 引发的安全性思考

  软件工程中,不论使用哪种开发语言,安全性一直是一个非常棘手却又重要的问题。安全性是软件开发领域永远的主题之一,而且随着互联网的蜂拥发展而带动的新技术的兴起与革命(比如近几年火起来的node.js,python,go等,甚至微软也开源后的.net Core),软件工程中的安全性更加的凸显与重要了。

  那么,什么才是危险的呢?我的第一反应是注入攻击,比如SQL注入攻击。一个典型的场景是WEB应用中,用户登陆功能,根据用户输入的用户名密码获取相应的数据,那么SQL注入就应运而生,模拟用户名,密码加入特殊字符,加入恶意脚本等等手段,进而造成不了可挽回的后果。比如,正常脚本当如:

select * from userInfo where username=‘input_Name‘ and password=‘input_Pwd or‘

 那么,如果是这样的呢?

select * from userInfo where username=‘input_Name‘ and password=‘input_Pwdte‘ or 1=1 or ‘‘

  关于如何编写安全的Java代码,Sun官方给了一份指南,有兴趣的同学可以参考这篇文章,大致为:

    • 静态字段
    • 缩小作用域
    • 公共方法和字段
    • 保护包
    • equals方法
    • 如果可能使对象不可改变
    • 不要返回指向包含敏感数据的内部数组的引用
    • 不要直接存储用户提供的数组
    • 序列化
    • 原生函数
    • 清除敏感信息

  比如,DoS是一种常见的网络攻击,有人戏称为“洪水攻击”。其惯用手法是通过某种手段,比如大量的机器发送请求,将目标网站宽带和其资源耗尽,导致用户无法正常访问,甚至服务器的宕机。

  而对于此类问题,如果单从服务器级别考虑,多少欠缺,我们或许需要考虑程序级别的攻击,比如Java,JVM,以及涉及到的线程方面的安全,应用程序的瑕疵等进行低成本的DoS攻击。

  而在面试中,我们都会被问到安全性的问题,却大多比较多泛泛,大而广,而大多数的安全性问题都与代码安全性有关。我们回顾下Java代码的运行过程:

  首先编译器把.java文件编程成.class字节码文件,然后由类加载器负责把.class文件加载到JVM,再由字节码校验进行校验,然后由Java解释器负责把该类文件解释为机器码执行。

  在类加载器加载.class文件到java虚拟机的过程中,类加载器通过区分本机文件系统的类和网络系统导入的类增加安全性(不允许网络上的应用程序修改本地的数据),本机的类先被加载,一旦所有的类加载完,执行文件的内存划分就固定了,然后字节码校验器开始校验.class字节码文件,字节码校验器不检查那些可信任的编译器所产生的类文件。通过之后,java解释器材负责把类文件解释成为机器码进行执行。

//  a b c 都是int类型的数值
	if (a - b < c) {
            // …
    }

  这段看似简单,没毛病的代码会引发下列问题:

  如果b<0,而造成的数据溢出,你能想象出多少问题?!而对于越界的处理虽然Java底层给出了很好的解决,但是数值而造成内存问题不容小觑。

  当然,过多的考虑安全性问题,势必会造成应用程序的冗余甚至疲软,这些需要视情况而定,而不可盖棺而论。

  再比如,对于一段可能出现问题的代码,常用手段 try … catch(){… },那么问题来了,catch的是什么?而一般情况下,我们程序需要抓取到catch,因为要做日志处理,那么日志中不可或缺的有类似代码位置,方法名,以及错误原因等,甚至包含了敏感信息。当然,不可避免,我的建议是,尽量使用内部标识的异常信息,而返回给客户端的类似异常消息尽量少的自动返回的异常消息。

  对于安全标准特别高的系统,甚至可能要求敏感信息被使用后,要立即明确再内存中销毁,以免被探测到;或者避免在发生core dump时,意外暴露。

  开发和测试阶段

   1. 尽量的规范化代码,可参考《阿里巴巴开发手册》

   2. 尽量多的code review,避免不必要尴尬代码出现

   3. 在代码check-in等环节,利用hook机制去调用规则检查工具,保证不合规范代码进入OpenJDK代码库

  部署阶段

  可参考JDK在加密方法的路线图

  以上皆为日常开发总结,也借鉴网上大神的文章,略略整理一二,权作学习使用,当然面试能帮到不慎感动了,以后有机会再做梳理。

  欢迎指点。

原文地址:https://www.cnblogs.com/fuguoliang/p/9748882.html

时间: 2024-08-28 17:09:07

有 a - b < c 引发的安全性思考的相关文章

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR

display:inline-block引发的间隙思考

一.导火线 没错,总有一类属性在助你轻松寻得捷径的同时,也可为你增添烦劳,比如本文的主谋display:inline-block.众前端们所诸知,其作用是将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格.然而不幸的是,它并没有得到所有浏览器的支持,比如ie6.7和古老一点的firefox完全无视它,由于firefox的老版本几乎已经从市场中消失,所以名义上firefox是支持display:inline-block的,除此之外,伟大的chrome.O

由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的Web系统进行提交.以前两种类型的任务都被提交至Yarn中一个名称为“hive”的队列,为了避免两种类型的任务之间相互受影响以及并行任务数过多导致“hive”队列资源紧张,我们在调度系统中构建了一个任务缓冲区队列,所有被提交的任务(手动任务.调度任务)并不会直接被提交至集群,而是提交至这个缓冲区队列中,

long和BigDecimal引发的管理思考

关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但是渐渐的,已经对此没有那么的一根筋在乎了,至少从整个决策思路而言. 在涉及到金额或金融的计算中,有些时候为了显示或者严格准确性的要求,很多初级开发会毫不犹豫的选择BigDecimal,毕竟无论是java官方还是教科书都是这么说的.随着开发经验的增加.对性能优化的关注等等各种原因,很多的项目或系统开始

由SpringJdbc引发的一点思考

本来项目中使用的是Hibernate,后来换Mybatis,但由于项目中很多sql语句是动态的,无实体,参数不固定,列也不固定,Mybatis显得太重量了,所以我又选择用spring jdbc这种更轻量的封转替换掉原来的jdbc,更换dao层真心让我想吐了. 其实,无论Spring jdbc,Hibernate,还是mybatis都是对jdbc的封装,封装不变的部分,留下可变的部分让我们自己写. 使用 Spring jdbc,其实最主要的是使用它的三个模板,Spring的JdbcTemplate

程序员删数据库事件引发的个人思考

最近周围的人都在讨论程序员删数据库这件事情,业内的人在讨论怎么才能锁住数据库并删掉.外行的人在谴责这个程序员的职业道德.中午朋友给我聊起这件事情的时候,我感觉没有那么简单,只是给朋友说,事情估计没有网上说的那么简单,毕竟这个只是那个创业老板的一面之词.等到晚上的时候,事情居然出现了反转,是这位老板严重扭曲了事实,让这个程序员精神受到了严重的损害. 当晚上看到这个程序员的信件之后,我突然感觉好像一下子感悟到了什么.对周围的事情,当你没有自己的判断标准和深入思考的话,非常容易陷入浅尝辄止的漩涡,容易

jq 之Autocomplete 引发联想及思考

前情纪要:JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件,这些控件主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Magnifier,ProgressBar,Spinner等,其中Autocomplete能够非常容易的帮我们实现类似于百度搜索的智能提示功能. 我现在要实现的是在订单中心下单时,实现通过输入客

乱码引发的编码思考

转载请声明:http://blog.csdn.net/softmanfly/article/details/43611985 乱码是软件开发中的常见问题,程序员如果对码不清楚的话经常会被各种码搞得晕头转向,我在开发一个JavaWeb项目时也遇到了一些乱码的问题,百思不得其解,最后通过阅读源码和一定的猜测,对编码和乱码问题有了一定的心得体会,故记录下来(如果只想深入了解Java中的编码相关内容的话可以直接看红字下面的部分): 问题来由:在http get方法中url后面添加query string

由一次惨痛的数据灾难引发的彻底思考

概述 前一段时间硬盘突然崩了,这几乎要让我所有的艰辛努力都毁于一旦,因为我所有的劳动成果都存储在硬盘中. 事实上,我之前的数据备份与安全工作已经做的不错了,对数据经常进行备份,而且分散存储,并进行了加密,由于一直以来数据并没有发生过丢失,久而久之,数据备份的频率越来越低,最近一次备份在本地磁盘已经是十几天之前了,听上去还不错,但是整个硬盘都报废了,最近一次备份到网盘已经是两个月前的事情了,听上去还不算太坏,但雪上加霜的是,由于担心通过压缩加密的备份不安全的问题,在这次数据灾难前已经删除了所有存储