gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:06 26 4
gpt4 key购买 nike

我开发了一个项目,其中使用了多个sql查询。现在我想监控一些查询以提高安全性。所以我希望每个查询都首先通过一个函数传递。由于查询太多,所以我无法返回并编辑每个文件和查询。有什么方法可以让我在查询发送到 mysql 服务器之前陷入查询?

最佳答案

有四种方法可以实现这一点,具体取决于您使用的是什么,最后一种更可靠。

一般查询日志

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

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

有关一般查询日志的更多信息,请参阅 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 .

关于php - 如何通过函数路由每个 mysql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com