通用SQL查询侦听器

时间:2012-12-26 20:35:08

标签: sql database listener

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

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

有没有办法一般地这样做,以便它不依赖于特定的数据库后端?

1 个答案:

答案 0 :(得分:3)

基本系统并不是特别容易,但也不是非常困难。您创建一个守护程序,该守护程序侦听端口(或一组端口)以进行连接尝试。它接受这些连接,然后建立自己与DBMS的连接,形成一个中间人的中继/拦截点。主要问题在于如何配置以下内容:

  1. 客户端连接到您的通用SQL侦听器(GSL)而不是DBMS自己的侦听器,
  2. GSL知道如何连接到DBMS的侦听器(IP地址和端口号)。
  3. 但是,你仍然可以遇到问题。最值得注意的是,如果GSL与DBMS侦听器位于同一台机器上,那么当GSL连接到DBMS时,它会将DBMS视为本地连接而不是远程连接。如果GSL位于不同的计算机上,则看起来所有连接都来自运行GSL的计算机。

    此外,如果信息是以加密方式发送的,那么您的GSL只能拦截加密通信。如果加密有任何好处,您将无法登录。你可能能够处理Diffie-Hellman交换,但是你需要知道你到底在做什么,以及你正在拦截的DBMS是什么 - 你可能需要从客户那里获得支持他们会通过你的中间人系统。当然,如果'客户'是您控制下的Web服务器,您可以处理所有这些。

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

    有些商业产品可以做这种事情。我在IBM工作,并且知道IBM的Guardium产品包含了许多DBMS的功能(包括,我相信,上面提到的所有这些 - 如果有问题,可能是MySQL支持最少)。即使对于像Guardium这样的系统,处理加密通信仍然很棘手。

    我有一个在Unix上运行的守护进程,它适用于一个特定的DBMS。它处理大部分内容 - 但不会试图干扰加密通信;它只是记录两个政党对彼此说的话。如果您需要代码,请与我联系 - 查看我的个人资料。许多部分可能可以与其他DBMS重用;其他部分完全是为其设计的特定DBMS所特有的。