如何通过函数路由每个mysql查询?

时间:2013-08-25 19:13:06

标签: php mysql sql

我开发了一个项目,在该项目下使用了几个sql查询。现在我想监视一些查询以增加安全性。所以我希望每个查询首先通过一个函数。由于查询太多,所以我无法返回并编辑每个文件和查询。有没有一种方法可以在将查询发送到mysql服务器之前进入查询?

2 个答案:

答案 0 :(得分:3)

根据您使用的内容,有四种方法可以实现此目的,最后一种方法更可靠。

常规查询日志

MySQL提供了一种机制,可以通过常规查询日志记录mysqld进程正在执行的所有操作。正如您在问题中描述的那样,您可能没有持久连接,因此您需要:

  • 启动mysqld进程时启用MySQL常规查询日志,--log[=file_name]
    • 使用SET GLOBAL general_log = 'ON'设置全局/会话变量。

有关常规查询日志的详细信息,请参阅MySQL 5.1 reference manual

使用sed(或手动!)

此技术涉及创建一个新函数,并重命名所有mysqli_*函数调用以调用另一个函数。

假设您新创建的函数名为proxy_query(),您可以使用sed遍历所有文件并自动更改它们:

sed i '.bck' 's/mysqli_query/proxy_query/'

-i参数指定应该就地编辑文件,并且应该复制原始文件并附加.bck扩展名。

runkit扩展程序

我必须承认我在这里很天真,并且我之前没有使用过这个特定的扩展 - 但是可以用这个PECL扩展名重命名函数。 可以在此处找到此扩展的要求,并注意它与PHP捆绑

如上所述,您可以创建一个所有呼叫都将通过的代理功能。我们假设它也被称为proxy_query。用法会是这样的:

// rename the function (a very bad idea, really!)
runkit_function_renam('mysqli_connect', 'proxy_super');

function mysqli_query($query, $resultmode = MYSQLI_STORE_RESULT)
{
    // do something with the SQL in $query
    // .. and call mysqli_query, now proxy_super
    return proxy_super($query, $resultmode);
}

我必须在此注意非常不鼓励这种方法。您不应该需要设置默认的PHP函数。

使用Pdo / OO-mysqli

这是最简单的技术,也可能是最可靠的技术。如果您已经使用Pdo,则可以简单地扩展\Pdo类。类似的方法可以与MySQL Improved(mysqli):

一起使用
class MyPdo extends \Pdo
{
    public function query($query [, ... ]) 
    {
        // do something with $query
        return parent::query($query [, ... ]);
    }
}

此处还要注意,这仅在您使用Pdo时有效,并且如果您能够更改Pdo对象的实例化,则将其覆盖到您自己的类:MyPdo。 有关\Pdo班级及其子级的详细信息,请参阅manual

答案 1 :(得分:0)

如果要使用SQL事件探查器监视传入的查询,这是一种很好的方法,可以收集有关SQL内部信息的信息,而无需通过单个函数或过程传递它。