我开发了一个项目,在该项目下使用了几个sql查询。现在我想监视一些查询以增加安全性。所以我希望每个查询首先通过一个函数。由于查询太多,所以我无法返回并编辑每个文件和查询。有没有一种方法可以在将查询发送到mysql服务器之前进入查询?
答案 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,则可以简单地扩展\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内部信息的信息,而无需通过单个函数或过程传递它。