Java Server Page(JSP)作为建立动态网页的技术正在不断升温。JSP 和 ASP、PHP、工作机制不太一样。 一般说来, 页面在执行时是编译式, JSP 而不是解释式的。 首次调用 JSP 文件其实是执行一个编译为 Servlet 的过程。当浏览器向服务器请求这一个 JSP 文件的时候,服务器将检查自上次编译后 JSP 文件是否有改变, 如果没有改变,就直接执行 Servlet,而不用再重新编译,这样,效率便得到了明显提高。 今天我将和大家一起从脚本编程的角度看 JSP 的安全,那些诸如源码暴露类的安全隐患就不在这篇文 章讨论范围之内了。写这篇文章的主要目的是给初学 JSP 编程的朋友们提个醒,从一开始就要培养安全编 程的意识,不要犯不该犯的错误,避免可以避免的损失。另外,我也是初学者,如有错误或其它意见请发 帖赐教。 一、认证不严——低级失误 认证不严——低级失误 —— 在溢洋论坛 v1.12 修正版中, user_manager.jsp 是用户管理的页面,作者知道它的敏感性,加上了一把锁:
if ((session.getValue("UserName")==null)││(session.getValue("UserClass ")==null)││(! session.getValue("UserClass").equals("系统管理员"))) { response.sendRedirect("err.jsp?id=14"); return; }
如果要查看、修改某用户的信息,就要用 modifyuser_manager.jsp 这个文件。管理员提交 somesite/yyforum/modifyuser_manager.jsp?modifyid=51 就是查看、修改 ID 为 51 的用户的资料(管理员默认的用户 ID 为 51)。但是,如此重要的文件竟缺乏认 证,普通用户(包括游客)也直接提交上述请求也可以对其一览无余(密码也是明文存储、显示的)。 modifyuser_manage.jsp 同样是门户大开,直到恶意用户把数据更新的操作执行完毕,重定向到 user_manager.jsp 的时候,他才会看见那个姗姗来迟的显示错误的页面。显然,只锁一扇门是远远不够的, 编程的时候一定要不厌其烦地为每一个该加身份认证的地方加上身份认证。 二、守好 JavaBean 的入口 JSP 组件技术的核心是被称为 bean 的 java 组件。在程序中可把逻辑控制、数据库操作放在 javabeans 组件中,然后在
JSP 文件中调用它,这样可增加程序的清晰度及程序的可重用性。和传统的 ASP 或 PHP 页 面相比,JSP 页面是非常简洁的,因为许多动态页面处理过程可以封装到 JavaBean 中。 要改变 JavaBean 属性,要用到“<jsp:setProperty>”标记。 下面的代码是假想的某电子购物系统的源码的一部分, 这个文件是用来显示用户的购物框中的信息的, 而 checkout.jsp 是用来结帐的。
<jsp:useBean id="myBasket" class="BasketBean">
<jsp:setProperty name="myBasket" property="*"/> <jsp:useBean> <html> <head><title>Your Basket</title></hea
d> <body> <p> You have added the item <jsp::getProperty name="myBasket" property="newItem"/> to your basket. <br/> Your total is $ <jsp::getProperty name="myBasket" property="balance"/> Proceed to <a href="checkout.jsp">checkout</a>
注意到 property="*"了吗?这表明用户在可见的 JSP 页面中输入的,或是直接通过 Query String 提 交的全部变量的值,将存储到匹配的 bean 属性中。 一般,用户是这样提交请求的:
somesite /addToBasket.jsp?newItem=ITEM0105342
但是不守规矩的用户呢?他们可能会提交:
somesite /addToBasket.jsp?newItem=ITEM0105342&;balance=0
这样,balance=0 的信息就被在存储到了 JavaBean 中了。当他们这时点击“chekout”结账的时候, 费用就全免了。 这与 PHP 中全局变量导致的安全问题如出一辙。由此可见:“property="*"”一定要慎用! 三、长盛不衰的跨站脚本 跨站脚本 (Cross Site Scripting) 攻击是指在远程 WEB 页面的 HTML 代