【发布时间】:2012-08-12 13:54:11
【问题描述】:
有时我查看我的 MySQL 日志,偶然发现一些 AES_ENCRYPT/AES_DECRYPT 请求以明文形式显示密码。
如果我在 PHP 中创建日志,我将能够delete 他们。
但是MySQL general/slow query logs 呢?它们是可用的选项还是可以设置一个不会保存在日志中的 mySQL 变量?
【问题讨论】:
有时我查看我的 MySQL 日志,偶然发现一些 AES_ENCRYPT/AES_DECRYPT 请求以明文形式显示密码。
如果我在 PHP 中创建日志,我将能够delete 他们。
但是MySQL general/slow query logs 呢?它们是可用的选项还是可以设置一个不会保存在日志中的 mySQL 变量?
【问题讨论】:
不幸的是,我不知道如何为单个语句禁用 MySQL 日志记录。出于这个原因,MySQL 文档建议保护日志的安全:
来自5.2.3. The General Query Log
从 MySQL 5.6.3 开始,写入一般语句的密码 查询日志由服务器重写,不会按字面意思出现 文本。通用查询日志可以禁止密码改写 通过使用 --log-raw 选项启动服务器。这个选项可能是 用于诊断目的,将语句的确切文本视为 由服务器接收,但出于安全原因不推荐 用于生产。
在 MySQL 5.6.3 之前,语句中的密码不会被重写,并且 一般查询日志应该受到保护。见第 6.1.2.2 节, “Administrator Guidelines for Password Security”。
不幸的是,(从 5.6.3 开始)内置的反密码日志记录仅适用于 MySQL PASSWORD() 函数。
我看到一些可能的解决方案来解决您的问题:
【讨论】:
file_put_contents('/log_file_path', preg_replace('#\b(AES_(?:EN|DE)CRYPT)\s*\(\s*([\'^"])(.+?)\2\s*\)\b#i', '$1($2*****$2)', file_get_contents('/log_file_path'));
PASSWORD() - 我至少希望它也适用于 SET PASSWORD 查询 - 但是,@mgutt 我怀疑它不会与AES_ENCRYPT/AES_DECRYPT一起工作,因为它们不仅用于密码,而且是通用加密函数。