评论专栏:Soloman Barghouthi: 用于取消恶意或未授权数据库查询的技术

在 J2EE™ 应用服务器环境中,一致且准确的请求问责制是处理恶意或未授权数据库查询这样的事件的关键。本文介绍一种在 IBM ® WebSphere® 应用服务器环境中识别和处理恶意查询的简单技术 —— 无需重启应用服务器或者数据库。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

Soloman Barghouthi, 高级软件工程师, EMC

作者照片Soloman Barghouthi 是 IBM Rochester 实验室的高级软件工程师。他还是 WebSphere Application Server EJBContainer 团队的架构师和主管。Soloman 是一位数据库专家,发表过许多关于 datebase/WebSphere Application Server 交互的文章。



2010 年 5 月 20 日

停止查询

一个三层的企业架构由客户机层、中间层以及数据层组成。在很多 Java™ 2 Platform、Enterprise Edition (J2EE) 环境中,IBM WebSphere Application Server 提供了中间层。WebSphere Application Server 处理来自客户机层的请求,并进入数据层(例如,IBM DB2®),根据客户机的请求和输入来检索或者升级数据层。在很多情况下,进行数据库交互的客户机请求中会用到一个身份验证数据别名。调用者的身份缺失会导致问责制失效。问责制很重要,不仅对于识别谁正在做什么很重要(从跟踪角度看),而且对于支持 WebSphere Application Server 和数据库管理员对突发情况(例如,需要识别和取消未授权和恶意数据库查询)做出反应也很重要。

图 1.三层架构
图 1.三层架构

本文解释了如何使用 WebSphere Application Server 中的特性,用客户机信息来标记数据库连接,以及如何使您能够将此标记特性应用到有趣的解决方案中,例如用于识别和取消恶意查询。


用客户机信息标记数据库连接

WebSphere Application Server V6.0 中引入的这一特性能够使您用某些信息来标记数据库连接。然后这些信息由应用服务器传输到数据库层(如果数据库支持传输这些信息),这些信息在数据库层可用于识别谁正在该连接上工作。您可以在数据库连接上设置的信息包括:

  • CLIENT_ACCOUNTING_INFO:指定连接的问责信息。这一信息用于客户机问责目的,主要用于 DB2 for z/OS®。
  • CLIENT_LOCATION:指定驱动这一请求的客户机地址。
  • CLIENT_ID:指定连接的当前客户机用户名。这个用户名用于客户机问责目的,而不是 JDBC 连接的用户值;即,它不是一个身份验证数据别名。
  • CLIENT_APPLICATION_NAME:指定正在使用数据库连接的应用程序名称。

在 WebSphere Application Server V6.0 应用程序中,可以使用 com.ibm.websphere.rsadapter.WSConnection API 将这个信息设置在连接上,如图 2 所示。

图 2. WSConnection API
图 2. WSConnection API

从 WebSphere Application Server V7 开始,上述 API 已经被标准 JDBC 4.0 API 所取代,不再使用,如图 3 所示。

图 3. JDBC 4.0 Connection API
图 3. JDBC 4.0 Connection API

利用标记特性

试想您有一个根据用户请求,动态组装数据库请求的应用程序,然后使用 WebSphere Application Server 将这些请求提交给一个 DB2 数据库。在测试中,您发现在一些用例中,您想要取消由客户机错误提出的请求。那您应该怎么办呢?

清单 1 显示了简单示例,该示例执行一个您将想要识别和删除的数据库请求。

清单 1
.....
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/myDS"); 
conn=ds.getConnection(); 
stmt=conn.createStatement(); 
rs=stmt.executeQuery("Select * from myEmpTable");  
while(rs.next()){ 
out.println(rs.getString(1));

要在这里利用标记特性,您需要用客户机信息来标记数据库连接。清单 2 显示了如何实现这一点。

清单 2
import com.ibm.websphere.rsadapter.WSConnection
public void displayInfo()
{…..
Properties props = new properties();
 props.setProperty(WSConnection.CLIENT_APPLICATION_NAME,
	 "myspecialAppappname_displayInfo");

javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/myDS"); 
conn=ds.getConnection(); 
((WSConnection)conn).setClientInformation(prop);
stmt=conn.createStatement(); 
rs=stmt.executeQuery("Select * from myEmpTable"); 
while(rs.next()){ 
out.println(rs.getString(1)); 
}

现在这个应用程序用 myspecialAppappname_displayInfo 标记注释了它使用的连接。这样数据库连接就被客户机信息所标记,数据库管理员可以通过简单地查询连接的注释值来识别和取消与应用程序相关的任务。例如,一个 DB2 数据库管理员可以执行以下步骤来识别和取消这样一个查询:

  1. 从 DB2 命令窗口,发出以下指令来显示所有的数据库连接信息(图 4):

    db2 get snapshot for applications on sample

    图 4.获取快照命令
    图 4.获取快照命令
  2. 如图 4 所示,TP Monitor 客户机应用程序名称有一个值 myspecialAppappname_displayInfo,这个值是由应用程序进行设定的,用于识别连接。
  3. 您可以终止正用于执行查询的连接,方法是使用 Application 句柄值(这里是 78)并运行 DB2 force application 命令:

    db2 force application (78)

    这个应用程序命令会造成运行错误请求的连接被终止,并对应用程序抛出一个 StaleConnectionException。这样应用程序就必须像它遇到其它 StaleConnectionException 时一样来处理异常。

虽然结束一个挂起或者长时间运行的查询看起来是个复杂的任务,但是 WebSphere Application Server 的标记特性提供了一个简化任务的简便方法。这里所介绍的技术能适用于任何数据库,只要这个数据库使用类似于 DB2 的工具来显示和取消一个给定查询。

参考资料

学习

获得产品和技术

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Information Management
ArticleID=490372
ArticleTitle=评论专栏:Soloman Barghouthi: 用于取消恶意或未授权数据库查询的技术
publish-date=05202010