进来讨论者有分,关于JSP安全问题

freev 2003-12-02 04:10:59
先转载一篇文章,希望各位能够热烈讨论


JSP应用的安全问题



仙人掌工作室

01-9-21 下午 05:25:46



--------------------------------------------------------------------------------





一、概述

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

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

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

· 拙劣的访问控制,以及

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

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

二、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环境变量,让它指向一个恶意的程序,而这个恶意程序伪装成了exec()所调用程序的名字。为了避免这种危险,在进行任何外部调用之前显式地设置环境变量是一种较好的习惯。具体的设置方法是:在exec()调用中,把一个环境变量的数组作为第二个参数,数组中的元素必须是name=value格式。

当用户输入用来标识程序打开的任意类型的输入/输出流时,类似的问题也会出现。访问文件、数据库或其他网络连接时不应该依赖于未经检验的用户输入。另外,打开一个流之后,把用户输入直接发送给它是很不安全的。对于SQL查询来说这一点尤其突出。下面访问JDBC API的JSP代码片断很不安全,因为攻击者可以在他提交的输入中嵌入分隔命令的字符,从而达到执行危险命令的目的:

<%@ page import="java.sql.*" %> <!-- 这里加上一些打开SQL Server连接的代码 --> <% Statement stmt = connection.getStatement(); String query = "SELECT * FROM USER_RECORDS WHERE USER = " + request.getParameter("username"); ResultSet result = Statement.executeQuery(query); %>

如果username包含一个分号,例如:

http://server/db.jsp? username=joe;SELECT%20*%20FROM%20SYSTEM_RECORDS

一些版本的SQL Server会忽略整个查询,但还有一些版本的SQL Server将执行两个命令。如果是后者,攻击者就可以访问原本没有资格访问的数据库资源(假定Web服务器具有访问权限)。

进行适当的输入检验可以防止这类问题出现。
...全文
135 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
springtime 2003-12-05
  • 打赏
  • 举报
回复
有收藏价值!!!!
100health 2003-12-05
  • 打赏
  • 举报
回复
up
xyisman2 2003-12-05
  • 打赏
  • 举报
回复
up
menot 2003-12-05
  • 打赏
  • 举报
回复
非常不错!~
ymm 2003-12-05
  • 打赏
  • 举报
回复
...............这个要怎么说哦,全是好长的东东,没心情静下来看,哈哈,收起来先
netcobol 2003-12-05
  • 打赏
  • 举报
回复
有收藏价值!!!!
faintbear 2003-12-05
  • 打赏
  • 举报
回复
不错。不错。学习ing
freev 2003-12-04
  • 打赏
  • 举报
回复
up一下

怎么没人给点建设性的意见呢
plase
newfox 2003-12-03
  • 打赏
  • 举报
回复
好东西。。收藏
hojay2001 2003-12-03
  • 打赏
  • 举报
回复
!
lkpei 2003-12-03
  • 打赏
  • 举报
回复
收藏,很深刻!
StringTokenizer 2003-12-03
  • 打赏
  • 举报
回复
不错,收藏
207 2003-12-03
  • 打赏
  • 举报
回复
关注!
zhao_sh 2003-12-03
  • 打赏
  • 举报
回复
值得收藏
ladofwind 2003-12-03
  • 打赏
  • 举报
回复
y
luckygjl 2003-12-03
  • 打赏
  • 举报
回复
copy 收藏
kingssman 2003-12-03
  • 打赏
  • 举报
回复
真得很长,copy下来慢慢看
chinaraul 2003-12-03
  • 打赏
  • 举报
回复
好。
blue999star 2003-12-03
  • 打赏
  • 举报
回复
mark
lynx1111 2003-12-03
  • 打赏
  • 举报
回复
好东西。。收藏
加载更多回复(18)
基于SSM的个人博客系统设计软件程序源码+数据库+WORD毕业设计论文文档, 个人博客系统主要用于发表个人博客,记录个人生活日常,学习心得,技术享等,供他人浏览,查阅,评论等。本系统结构如下: (1)博主端: 登录模块:登入后台管理系统:首先进入登录页面,需要输入账号和密码。它会使用Shiro进行安全管理,对前台输入的密 码进行加密运算,然后与数据库中的进行比较。成功后才能登入后台系统。 博客管理模块: 博客管理功能为写博客和博客信息管理。写博客是博主用来发表编写博客的,需要博客标题,然后选择博 客类型,最后将博客内容填入百度的富文本编辑器中,点击发布博客按钮即可发布博客。 博客类别管理模块:博主类别管理系统可以添加,修改和删除博客类型名称和排序序号。将会显示到首页的按日志类别区域。 游客可以从这里查找相关的感兴趣的博客内容 评论信息管理模块:评论管理功能为评论审核和评论信息管理两部。评论审核是当有游客或自己发表了评论之后,博主需 要在后台管理系统中审核评论。若想将此评论显示在页面上则点击审核通过,否则点击审核不通过。 个人信息管理模块:修改博主的个人信息,可以修改昵称,个性签名,可以添加个人头像,修改个人简介; 系统管理功能模块:友情链接管理,修改密码,刷新系统缓存和安全退出,友情链接管理可以添加,修改,删除友情链接网址 (2)游客端: 查询博客: 查询具体哪一篇博客 查看博客内容: 查看博客内容 查看博主个人信息:查看博主个人简介 发表评论: 可以评论具体某篇博客 友情链接: 查看友情链接 目 录 第一章 绪论 1 第二章 相关技术介绍 2 2.1 B/S 简介 2 2.2 JAVA 简介 2 2.3 JSP 简介 3 2.4 springMVC简介 3 第三章 可行性析 4 3.1 技术可行性析 4 3.2 经济可行性析 4 3.3 操作可行性 4 3.4 法律可行性 4 第四章 系统设计 5 4.1 系统总流程 5 4.2 博主用例 6 4.3 游客用例 7 4.4 系统类 9 4.5 E-R图 11 4.6 系统表设计 14 第五章 系统实现 16 5.1 登录模块 16 5.1.1 博主登录 16 5.2 博客管理模块: 19 5.2.1 博客查询 19 5.2.2 博客新建 21 5.2.3 博客修改 23 5.2.4 博客删除 25 5.3 博客类别管理模块 26 5.3.1 添加博客类别 26 5.3.2 修改博客类别 28 5.3.3 删除博客类别 30 5.3.4 显示博客类别 32 5.4 评论管理模块 34 5.4.1 审核评论 34 5.4.2 删除评论 36 第六章 系统测试 38 6.1 前台模块测试 38 6.2 后台模块测试 38 参考文献 41 致 谢 42 第一章 绪论 个人博客是人们在网络上展现自己个性的一种方式。自从互联网走进千家万户,大受人们喜爱。大家都喜欢通过网络来获取各种各样的信息。而在网络上,你也可以畅所欲言,而个人博客也是其中一种。在个人博客上,你可以发表自己的心路旅程,发表自己的工作经验,发表技术博客等等。 首先介绍一下什么是博客,它也被称为网络日志。博客其实就是一个网页,它是由各种各样的帖子组成。这些帖子可以是你某一天观看电影的感慨,也可以是阅读到某篇书籍的读后感,更可以是你在自己技术领域的心得。它就是一个网页,但是大家可以在上面用文字或者图片享自己的心情等,它提供的内容可以用来进行交流。 博客最开始的时候是论坛下的一个子系统。最早参与博客的都是一些信息技术的一些专家和学者,讨论的都是专业技能。直到发现了博客的商业价值,一些开放了自发式的博客,大家也都发现了博客享和讨论的趣味。越来越多的人参与进来,博客也越来越风靡盛行。 博客与论坛有许多的相似之处,许多朋友都不清他们两的区别。首先,论坛和博客都可以进行交友和交流等。而其中论坛注重的是集体讨论,博客注重的是个人享。它们两者的核心点就有着很大的区别。论坛的创建的用户是基于为众人服务,而博客是为了博主服务。它们的不同点还有在形式上的不同。博客是独立存在的。而论坛并不是。总结起来,论坛是多人一起交流的地方,互动性强,社交性强。博客是发表个人文章的地方,虽然也可以交流,但更多的还是自娱自乐。 第二章 相关技术介绍 2.1 B/S 简介 软件系统体系结构为两种,是客户机/服务器结构和浏览器/服务器结构。其中的浏览器/服务器结构就是B/S结构。 C/s模式:是客户端/服务器(Client/Server)模式,主要指的是传统的桌

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧