Java服务器端编程安全必读(4)
从表面上看,这些代码只允许用户访问example Bean的名字。然而,了解该系统的用户可以访问“http://whereever.com/example.jsp?name=Fred&password=hack”这种URL。这个URL既改变name属性,也改变password密码属性。当然,这应该不是页面编写者的意图,作者的意图是设计一个只允许用户访问名字属性的页面。因此,在使用
<jsp:setProperty property="*" ... />。>
时应该非常小心
字符串被解释执行的问题可能在允许嵌入脚本代码的任何环境中出现。例如,这类问题可能在Xalan(也称为LotusXSL)中出现,当然这是指系统设置不严格、易受攻击的情况下。
Xalan的脚本支持能够关闭(而且这是Xalan的默认设置),在敏感的应用中关闭脚本支持是一种明智的选择。当你需要用DOM处理XML文档时还必须考虑到另外一点:DOM保证所有文本都经过正确的转义处理,防止非法的标记插入到脚本之内。LotusXSL缺乏这个功能,但这绝不是一个BUG。支持脚本是LotusXSL的一个特色,而且它(明智地)默认处于关闭状态。XSL的W3C规范并没有规定支持脚本的能力。
现在我们来看看字符串解释执行如何影响SQL和JDBC。假设我们要以用户名字和密码为条件搜索数据库中的用户,Listing 5的Servlet代码看起来不错,但事实上它却是危险的。
(Listing 5)
String user = request.getAttribute("username");
String pass = request.getAttribute("password");
String query = "SELECT id FROM users WHERE
username="+user+" AND password="+pass;
Statement stmt = con.createStatement(query);
ResultSet rs = con.executeQuery(query);
if (rs.next())
{
// 登录成功
int id = rs.getInt(1);
...
}
else
{
// 登录失败
...
}
- 上一篇:Java应用程序中创建图像[图]
- 下一篇:[基础知识]接触 Java概述