代码安全之我见

    不管在哪个行业,“严把质量关”都是需要固守的原则之一,软件行业也不例外。系统的质量可以从很多方面衡量,如性能、可靠性、可用性、吞吐量、可管理性、安全性等。其中安全是非常重要的一个方面,假设一个网上银行系统,非常好用,非常便捷,但如果有安全隐患,将是致命的漏洞。

         安全包括方方面面,操作系统的安全,网络的安全,中间件的安全等等。然而,代码本身的安全问题,却往往容易被忽略。如果对代码本身的使用不当,表面看起来,系统功能的实现没有任何问题,可是系统却极其容易被攻击,导致信息泄漏,数据被篡改等恶果。写代码容易,写安全的代码就有一定的难度。目前很多公司企业的技术主管最头疼的问题就是,程序员可以完成项目,却无法保证项目代码层次的安全性。

         目前500强企业中的大多数企业均采用JavaEE构建企业Web应用,除了采用JavaEE一些核心技术和框架,如JSPEJBJSF之外,还有很多第三方框架被大量使用,如StrutsHibernateSpring等。对于开发人员来讲,如果不了解这些技术本身的正确使用方法,仅仅以实现功能为目的,那么最终代码就往往可能存在致命的安全隐患。

         举一个最简单的例子,可以直观地感受一下,如果不注重代码安全的严重后果。假设用如下Java代码进行查询。

String name = request.getParameter("name");

//省略

ResultSet rs = conn.createStatement().executeQuery("SELECT Data FROM Users WHERE Name = '"+name+"'");

 

         如果用户输入John,那么代码执行时的SQL语句为:

ResultSet rs = conn.createStatement().executeQuery("SELECT Data FROM Users WHERE Name = John’);将查询得到John对应的Data属性。

         进一步假设,如果根本不存在Rose这个用户名,但是却希望看到所有用户的Data属性,用户只要这样输入即可:

         Rose’  or ‘1’=’1

         运行时,生成的代码如下:

ResultSet rs = conn.createStatement().executeQuery("SELECT Data FROM Users WHERE Name = ‘joe’ or ‘1’ = ‘1’);显而易见,这条SQL语句将把Users表中的所有行的Data属性返回。

上面的这个简单例子,就是SQL注入的一种。开发人员如果不知道这样的代码有安全漏洞,就很容易会写出上面的代码,导致系统很容易被攻击。要创建安全的JavaEE Web应用,有很多方面值得注意,如输入验证、输出验证、保护敏感数据、限制应用入口点等。

由于网络资源发达,书籍众多,目前广大企业的开发员,对于编程技术都可以比较快速地掌握。然而,专门针对于某个技术方向,如何编写安全的代码,相对资源却非常少,也不够系统,这将是开发员急需加强的一个方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值