2012-12-26 30 views
2

如何最好地编写位于通用SQL数据库(SQL Server,MySQL,Oracle等)之前的应用程序并侦听SQL查询?通用SQL查询侦听器

应用程序需要根据特定查询类型拦截(阻止传递到SQL数据库)或传递(发送到SQL数据库)查询。

有没有办法做到这一般,以便它不绑定到特定的数据库后端?

+0

你所描述的内容听起来确实很难做到。你能解释几个拦截SQL查询的用例吗?也许有一个更简单的方法。 –

+0

嗯,我在想我们的应用程序可能会在端口上侦听SQL查询,如果不拦截,只能将查询转发到SQL数据库正在侦听的端口。基本用例只是一个“SQL查询过滤器”,它可以禁用除SQL数据库以外的特定查询 – user1853046

+0

单独监听MS SQL服务器的端口,因为它可以配置为使用动态端口(更改每次开始)。为什么不使用标准安全功能来禁用特定查询? –

回答

3

基本的系统并不是特别容易,但它也不是很难。您创建一个监听端口(或一组端口)的连接尝试的守护进程。它接受这些连接,然后与DBMS建立自己的连接,形成一个中间人中继/拦截点。主要的问题是如何配置的东西,使:

  1. 的客户端连接到通用SQL监听器(GSL),而不是DBMS自己的监听器,并
  2. 的GSL知道如何连接到数据库管理系统的监听器(IP地址和端口号)。

虽然您仍然可能遇到问题。最值得注意的是,如果GSL与DBMS监听器位于同一台机器上,那么当GSL连接到DBMS时,它会像本地连接而不是远程连接一样查看DBMS。如果GSL位于不同的机器上,则看起来所有连接都来自GSL正在运行的机器。

此外,如果信息正在发送加密,那么您的GSL只能拦截加密通信。如果加密是好的,你将无法记录它。你可能能够处理Diffie-Hellman交换,但是你需要知道你在做什么,以及你正在截取的数据库管理系统是什么 - 你可能需要从客户端买入他们会通过你的中间人系统。当然,如果'客户'是你控制下的网络服务器,你可以处理所有这些。

只要您的代码只是传输和记录查询,连接的细节往往是足够直接的。每个DBMS都有自己的协议来处理SQL请求,拦截和修改或拒绝操作需要了解每个DBMS的协议。

有商业产品做这种事情。我为IBM工作,并且知道IBM的Guardium产品包含了许多DBMS的能力(包括我相信,上述所有内容 - 如果存在问题,可能是支持最少的MySQL)。处理加密通信仍然非常棘手,即使对于Guardium等系统也是如此。

我有一个守护进程,它运行在Unix上,适用于一个特定的DBMS。它处理大部分 - 但不会干扰加密通信;它只是记录两个最终派对对彼此说的话。联系我,如果你想要的代码 - 请参阅我的个人资料。许多部分可能会与其他DBMS重用;其他部分完全是针对其设计的特定DBMS特有的。

+0

提及Guardium是我第一次想到的+1。 – cairnz

+0

感谢您的好消息。 –

相关问题