Java服务器端编程安全必读

2016-01-29 13:02 23 1 收藏

Java服务器端编程安全必读,Java服务器端编程安全必读

【 tulaoshi.com - Java 】

  一、概述

  编写安全的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代码将产生溢出:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/java/)

  char[] bad = new char;

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

  try {

  char[] bad = new char;

  bad = 50;

  }

  catch (ArrayOutOfBoundsException ex) {

  ... }

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/java/)

  

  这种处理过程永远不会导致不可预料的行为。无论用什么方法溢出一个数组,我们总是得到ArrayOutOfBoundsException异常,而Java运行时底层环境却能够保护自身免受任何侵害。一般而言,用Java字符串类型处理字符串时,我们无需担心字符串的ArrayOutOfBoundsExceptions异常,因此它是一种较为理想的选择。

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

  三、竞争状态

  竞争状态即Race Condition,它是第二类最常见的应用安全漏洞。在创建(更改)资源到修改资源以禁止对资源访问的临界时刻,如果某个进程被允许访问资源,此时就会出现竞争状态。这里的关键问题在于:如果一个任务由两个必不可少的步骤构成,不管你多么想要让这两个步骤一个紧接着另一个执行,操作系统并不保证这一点。例如,在数据库中,事务机制使得两个独立的事件“原子化”。换言之,一个进程创建文件,然后把这个文件的权限改成禁止常规访问;与此同时,另外一个没有特权的进程可以处理该文件,欺骗有特权的进程错误地修改文件,或者在权限设置完毕之后仍继续对原文件进行访问。

  一般地,在标准Unix和NT环境下,一些高优先级的进程能够把自己插入到任务的多个步骤之间,但这样的进程在Java服务器上是不存在的;同时,用纯Java编写的程序也不可能修改文件的许可权限。因此,大多数由文件访问导致的竞争状态在Java中不会出现,但这并不意味着Java

来源:http://www.tulaoshi.com/n/20160129/1488629.html

延伸阅读
标签: PHP
  假设有10个网站,分布在各地,它们的库存要同步,而数据库不支持远程连接。 我们要实时地取得服务器的库存数,可以通过很多种方法,我所知道的有以下几种: ·CURL方式 ·SOCKET方式 ·PHP5中的SOAP方式 以下分别给出示例来实现它: CURL方式 client.php <?php $psecode = ’NDE005’;...
标签: PHP
  “零存整取”是工薪阶层常用的投资方式,这就需要计算该项投资的未来值,从而决定是否选择某种储蓄方式。 (1)函数分解 FV函数基于固定利率及等额分期付款方式,返回某项投资的未来值。 语法:FV(rate,nper,pmt,pv,type) Rate为各期利率;Nper为总投资期,即该项投资的付款期总数;Pmt为各期所应支付的金额,其...
标签: ASP
  操作服务器控件的事件 每一个asp+的服务器控件都有自己的属性,方法和事件。asp+的开发者现在可以清楚的修改和交互自己的页面 下面的这个例子,我们用到了两个服务器控件<asp:button runat=server ,<asp:label runat=server 和button 的 click 事件 <html <head <link rel="stylesheet"href="intro...
标签: Web开发
1. Accordion Accordion可以让你设计多个panel 并且一次只显示一个Panel .在页面上的显示效果就像是使用了多个CollapsiblePanels只不过每一次只展开其中一个CollapsiblePanel.Accordion控件内部包含了若干个AccordionPane,每一个AccordionPane的template里包括了对其Header和Content的定义。我们可以在后台代码中通过SelectedIndex属性取得...
标签: ASP
  以前在这里也曾经有一些文章谈到了在ASP中生成动态图表的问题,但那些文章中所谈到的一些方法都有某些方面的限制,如需要在客户端安装office2000或安装OWC,有些则可能在Intranet中使用时没什么问题,但在通过Internet访问的时候,就可能出现无法正常工作的现象(这主要和SQL Server的安全设置有关)。那么,我们如何来避免这些问题呢?...

经验教程

150

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部