JSP应用程序开发中安全问题的实例解析

2016-01-29 12:15 2 1 收藏

JSP应用程序开发中安全问题的实例解析,JSP应用程序开发中安全问题的实例解析

【 tulaoshi.com - Java 】

 

选择自 hf1650 的 Blog

 一、概述

  当网络编程越来越方便,系统功能越来越强大,安全性却指数倍地下降。这恐怕就是网络编程的不幸和悲哀了。各种动态内容生成环境繁荣了WWW,它们的设计目标就是为了给开发者更多的力量,给最终用户更多的方便。正因为如此,系统设计师和开发者必须明确地把安全问题作为一个考虑因素,事后追悔很难奏效。

  从安全的角度来看,服务器端WWW应用的弱点来源于各种各样的交互能力和传输通道。它们是攻击者直接可以用来影响系统的工具。在攻击者寻找和利用系统安全漏洞时,它们总是给系统安全带来压力。对付所有这些攻击的通用防卫策略就是所谓的输入验证。

  从同一层面考虑,主要有两种设计上的错误导致了安全方面的问题:

· 拙劣的访问控制。

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

· 对部署环境作隐含的假设。

  在有关安全的文献中,针对访问控制问题有着许多深入的分析。这里我们要讨论的是底层实现(代码和配置)上的安全管理问题,讨论的环境是JSP。或者说,我们将讨论恶意的用户输入伪装自身以及改变应用预定行为的各种方法,考虑如何检验输入合法性以及减少对信息和应用接口的不受欢迎的探测。

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

  二、JSP概述

  JSP技术允许把Java代码逻辑嵌入到HTML和XML文档之内,为创建和管理动态WWW内容带来了方便。JSP页面由JSP引擎预先处理并转换成Java Servlet,此后如果出现了对JSP页面的请求,Web服务器将用相应的Servlet输出结果作为应答。

  虽然JSP和Servlet在功能上是等价的,但是,和Servlet相比,JSP的动态内容生成方法恰好相反:JSP是把Java代码嵌入到文档之中,而不是把文档嵌入到Java应用之中。为访问外部功能和可重用的对象,JSP提供了一些用来和JavaBean组件交互的额外标记,这些标记的语法和HTML标记相似。

  值得注意的是:HTML语法属于JSP语法的一个子集(一个纯HTML文档是一个合法的JSP页面),但反过来不一定正确。特别地,为了便于动态生成内容和格式,JSP允许在标记之内嵌入其他标记。例如,下面是一段合法的JSP代码:


<A HREF = "<%= request.getRemoteUser() %"
 

  从本文后面可以看到,这种结构增加了安全问题的复杂性。

  与CGI相比,JSP具有更好的性能和会话管理(即会话状态持久化)机制。这主要通过在同一个进程之内运用Java线程处理多个Servlet实现,而CGI一般要求为每一个请求分别创建和拆除一个进程。

  三、安全问题

  由于完全开放了对服务器资源的访问,从JSP页面转换得到的不安全Servlet可能给服务器、服务器所在的网络、访问页面的客户机之中的任意一个或全体带来威胁,甚至通过DDoS或蠕虫分布式攻击,还可能影响到整个Internet。

  人们往往假定,Java作为一种类型安全的、具有垃圾收集能力的、具有沙箱(Sandbox)机制的语言,它能够奇迹般地保证软件安全。而且事实上,许多在其他语言中存在的低层次安全问题,比如缓冲或堆溢出,很少给Java程序带来危害。

  然而,这并不意味着人们很难写出不安全的Java程序,特别是对编写Servlet来说。验证输入和控制对资源的访问是始终必须关注的问题。另外,JSP的体系结构相当复杂,其中包含许多相互协作的子系统。这些子系统之间的交互常常是安全隐患的根源。

  除此之外,虽然现在所有的JSP实现都围绕着Java,但JSP规范允许几乎所有其他语言扮演这个角色。这样,这些替代语言的安全问题也必须加以考虑。

  简而言之,在JSP系统中产生安全漏洞的机会是相当多的。下面我们将讨论它们中最常见的一部分。

  四、非置信用户输入的一般问题

  非置信的用户输入(Untrusted User Input)实际上包含了所有的用户输入。用户输入来源于客户端,可以通过许多不同的途径到达服务器端,有时甚至是伪装的。为JSP服务器提供的用户输入包括(但不限于):

· 请求URL的参数部分;

· HTML表单通过POST或GET请求提交的数据;

· 在客户端临时保存的数据(也就是Cookie);

· 数据库查询;

· 其它进程设置的环境变量;

  用户输入的问题在于,它们由服务器端的应用程序解释,所以攻击者可以通过修改输入数据达到控制服务器脆弱部分的目的。服务器的脆弱部分常常表现为一些数据访问点,这些数据由用户提供的限定词标识,或通过执行外部程序得到。

  JSP能够调用保存在库里面的本地代码(通过JNI)以及执行外部命令。类Runtime提供了一个exec()方法。exec()方法把它的第一个参数视为一个需要在独立的进程中执行的命令行。如果这个命令字符串的某些部分必须从用户输入得到,则用户输入必须先进行过滤,确保系统所执行的命令和它们的参数都处于意料之内。

  即使命令字符串和用户输入没有任何关系,执行外部命令时仍旧必须进行必要的检查。在某些情况下,攻击者可能修改服务器的环境变量影响外部命令的执行。例如,修改path环境变量,让它指向一个恶意的程序,而这个恶意程

来源:https://www.tulaoshi.com/n/20160129/1485269.html

延伸阅读
标签: Web开发
一、 简介   AJAX,一个异步JavaScript和XML的缩略词,是最近出来的技术词语。异步意味着你可以经由超文本传输协议(HTTP)向一个服务器发出请求并且在等待该响应时继续处理另外的数据。这就意味着,例如,你可以调用一个服务器端脚本来从一个数据库中以XML方式检索数据,把数据发送到存储在一个数据库的服务器脚本,或者简单地装载一个XML...
标签: Web开发
一、 简介 AJAX,一个异步JavaScript和XML的缩略词,是最近出来的技术词语。异步意味着你可以经由超文本传输协议(HTTP)向一个服务器发出请求并且在等待该响应时继续处理另外的数据。 这就意味着,例如,你可以调用一个服务器端脚本来从一个数据库中以XML方式检索数据,把数据发送到存储在一个数据库的服务器脚本,或者简单地装载一个XML文件...
标签: Java JAVA基础
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,...
标签: SQLServer
  任何基于锁的并发系统的一个不可避免的特点是在某些条件下系统可能阻塞。当一个连接占有一个锁而另一个连接试图改变锁的状态时,第二个连接要么等待第一个连接释放锁,要么因此而被阻塞。 为了获得最好的可扩展性,性能和并发能力,在设计应用程序和查询语句时,应该注意尽量缩短事务的长度, 并且减少占有锁的时间。大多数并发问题往...
标签: Web开发
   本文讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强。而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势。在本文中,我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。其中,某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的...

经验教程

524

收藏

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