您现在的位置:赛迪网>>技术应用>>J2EE

Java服务器端编程安全问题必读本 (1)
作者:唐婉 发文时间:2005.09.13

一、概述

编写安全的Internet应用并不是一件轻而易举的事情:只要看看各个专业公告板就可以找到连续不断的安全漏洞报告。你如何保证自己的Internet应用不象其他人的应用那样满是漏洞?你如何保证自己的名字不会出现在令人难堪的重大安全事故报道中?

如果你使用Java Servlet、JavaServer Pages(JSP)或者EJB,许多难以解决的问题都已经事先解决。当然,漏洞仍有可能出现。下面我们就来看看这些漏洞是什么,以及为什么Java程序员不必担心部分C和Perl程序员必须面对的问题。

C程序员对安全漏洞应该已经很熟悉,但象OpenBSD之类的工程提供了处理此类问题的安全系统。Java语言处理这类问题的经验要比C少20年,但另一方面,Java作为一种客户端编程语言诞生,客户端对安全的要求比服务器端苛刻得多。它意味着Java的发展有着一个稳固的安全性基础。

Java原先的定位目标是浏览器。然而,浏览器本身所带的Java虚拟机虽然很不错,但却并不完美。Sun的《Chronology of security-related bugs and issues》总结了运行时环境的漏洞发现历史。

我们知道,当Java用作服务器端编程语言时,这些漏洞不可能被用作攻击手段。但即使Java作为客户端编程语言,重大安全问题的数量也从1996年的6个(其中3个是相当严重的问题)降低到2000年的1个。

不过,这种安全性的相对提高并不意味着Java作为服务器端编程语言已经绝对安全,它只意味着攻击者能够使用的攻击手段越来越受到限制。那么,究竟有哪些地方容易受到攻击,其他编程语言又是如何面对类似问题的呢?

二、缓存溢出

在C程序中,缓存溢出是最常见的安全隐患。缓存溢出在用户输入超过已分配内存空间(专供用户输入使用)时出现。缓存溢出可能成为导致应用被覆盖的关键因素。C程序很容易出现缓存溢出,但Java程序几乎不可能出现缓存溢出。

从输入流读取输入数据的C代码通常如下所示:

char buffer[1000];
int len = read(buffer);


由于缓存的大小在读入数据之前确定,系统要检查为输入保留的缓存是否足够是很困难的。缓存溢出使得用户能够覆盖程序数据结构的关键部分,从而带来了安全上的隐患。有经验的攻击者能够利用这一点直接把代码和数据插入到正在运行的程序。

在Java中,我们一般用字符串而不是字符数组保存用户输入。与前面C代码等价的Java代码如下所示:

String buffer = in.readLine();


在这里,"缓存"的大小总是和输入内容的大小完全一致。由于Java字符串在创建之后不能改变,缓存溢出也就不可能出现。退一步说,即使用字符数组替代字符串作为缓存,Java也不象C那样容易产生可被攻击者利用的安全漏洞。例如,下面的Java代码将产生溢出:

char[] bad = new char[6];
bad[7] = 50;


这段代码总是抛出一个java.lang.ArrayOutOfBoundsException异常,而该异常可以由程序自行捕获:

try {
char[] bad = new char[6];
bad[7] = 50;
}
catch (ArrayOutOfBoundsException ex)
{
...
}


这种处理过程永远不会导致不可预料的行为。无论用什么方法溢出一个数组,我们总是得到ArrayOutOfBoundsException异常,而Java运行时底层环境却能够保护自身免受任何侵害。

一般而言,用Java字符串类型处理字符串时,我们无需担心字符串的ArrayOutOfBoundsExceptions异常,因此它是一种较为理想的选择。

Java编程模式从根本上改变了用户输入的处理方法,避免了输入缓存溢出,从而使得Java程序员摆脱了最危险的编程漏洞。


1 2 3 4 下一页>>




赛迪网推出“IT博客”,花不到一分钟就完成注册
评论】 【推荐】 【 】 【打印】 【关闭

·Linux专区· ·黑客攻防·

· 循序渐进教你LINUX之软件配置方法
· 解析Linux环境下的ReiserFS文件系统
· 制作个版本Linux启动盘的四种通行方法
· 新手入门:浅谈Linux的文件系统
· 循序渐进学习系列之Linux的软件配置
· 实战讲解防范网络钓鱼技术大全
· 穿梭于防火墙下的黑马 DBB后门程序
· ISP被要求协助清理Sober蠕虫病毒
· 2006年网络安全最大私募浮出水面
· SMTP安全手册 Sendmail服务器安全
· 新的验证技术能消灭垃圾邮件吗?
· 什么都想知道 反垃圾邮件技术完全解析
·中国信息化· ·成功案例·

· 2005年度CIO评选揭晓 关注信息化建设尖兵
· 专题策划:中国信息化盘点2005 展望2006
· 制造业基于知识管理的创新
· 信息化建设中的六类知识转移
· 看清潜在风险:科利华摘牌与教育信息化反思
· 姜奇平:信息化与后现代的统一战线

· 思科DWDM技术上海证券交易所应用案例
· 思科智能信息网络助美特斯邦威快速成长
· 思科网络在北京现代汽车公司的成功应用
· 亮剑汽车制造 打造随需而动的采购供应链
· HP Integrity为金保工程添砖加瓦
· 山东农行采用HP方案打造数据上收前置系统

本周文章排行


内容字典

EJB:Enterprise JavaBeans,Java中用于开发企业级应用的技术标 准,他定义了一个用于开发和发布可重用的服务器端组件的模型,包括 Session beans,Entity beans以及Message-driven beans三种。
JTS:Java Transaction Service(Java事务服务),Java中 进行分布式事务管理的技术标准,它是基于CORBA对象事务服务(CORBA Object Transaction Service)的
Java Card API:符合ISO 7816-4的应用程序环境。主要用于智能卡的开发。

您还可以阅读

· Java回眸十周年:J2EE从起源到目的
· 为Web应用程序创建测试用例的方法
· Java访问数据库速度瓶颈问题的分析及解决
· Eclipse中使用ANT的实践笔记
· 深入掌握Java技术 EJB调用原理分析

社区推荐

· 教您如何使用消息驱动Beans(一)
· EJB核心技术及其应用系列专题之一
· EJB最佳实践:如何做实体bean的保护
· DisplayTag在技术开发时的应用指南
· 周末巨献:有可能挑战Java优势的四种技术
· 争议话题:选择JSF不选Struts的十大理由
· 初学者入门教程:Shell编程概述(一)
· 详细讲解Quartz如何从入门到精通