通用SQL查询侦听器

通用SQL查询侦听器,sql,database,listener,Sql,Database,Listener,如何最好地编写一个位于通用SQL数据库(SQL Server、MySQL、Oracle等)前面并侦听SQL查询的应用程序 根据特定的查询类型,应用程序需要能够拦截(阻止传递到SQL数据库)或传递(发送到SQL数据库)查询 有没有一种方法可以通用地做到这一点,从而使它不与特定的数据库后端绑定?基本系统不是特别容易,但也不是非常困难。您可以创建一个守护进程,该守护进程在一个端口(或一组端口)上侦听连接尝试。它接受这些连接,然后建立自己与DBMS的连接,形成中间人中继/拦截点。主要问题在于如何进行配置

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

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


有没有一种方法可以通用地做到这一点,从而使它不与特定的数据库后端绑定?

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

  • 客户端连接到您的通用SQL侦听器(GSL),而不是DBMS自己的侦听器,并且
  • GSL知道如何连接到DBMS的侦听器(IP地址和端口号)
  • 不过,您仍然可能遇到问题。最值得注意的是,如果GSL与DBMS侦听器位于同一台机器上,那么当GSL连接到DBMS时,它在DBMS看来就像本地连接,而不是远程连接。如果GSL位于不同的机器上,则所有连接看起来都来自GSL运行的机器

    此外,如果信息是加密发送的,那么GSL只能截获加密通信。如果加密效果良好,您将无法记录它。你可能能够处理Diffie-Hellman交换,但你需要知道你到底在搞什么,你正在拦截的DBMS在搞什么——你可能需要得到客户的认可,他们将通过你的中间商系统。当然,如果“客户机”是由您控制的web服务器,那么您可以处理所有这些问题

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

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


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

    您所描述的听起来很难做到。您能解释几个拦截SQL查询的用例吗?也许有一种更简单的方法。我想我的应用程序可以在一个端口上侦听SQL查询,如果不侦听,可以将查询转发到SQL数据库正在侦听的端口。基本用例只是一个“SQL查询过滤器”,它禁用除SQL数据库之外的特定查询仅侦听MS SQL server的端口,更不用说任何数据库可能很困难,因为它可以配置为使用动态端口(每次启动时都会更改)。为什么不使用标准的安全特性来禁用特定的查询呢?+1感谢我第一次想到Guardium。谢谢你提供的好信息。