【问题标题】:Is it possible to hide the password in MySQL General/Slow Query Logs?是否可以在 MySQL 常规/慢查询日志中隐藏密码?
【发布时间】:2012-08-12 13:54:11
【问题描述】:

有时我查看我的 MySQL 日志,偶然发现一些 AES_ENCRYPT/AES_DECRYPT 请求以明文形式显示密码。

如果我在 PHP 中创建日志,我将能够delete 他们。

但是MySQL general/slow query logs 呢?它们是可用的选项还是可以设置一个不会保存在日志中的 mySQL 变量?

【问题讨论】:

    标签: php mysql security aes


    【解决方案1】:

    不幸的是,我不知道如何为单个语句禁用 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() 函数。

    我看到一些可能的解决方案来解决您的问题:

    1. 对于每个查询:禁用日志、执行查询、启用日志
    2. 在您的应用程序本身中散列密码(在您的情况下为 php sha)
    3. 保护日志文件,使任何人都无法看到语句
    4. 登录可自行删除密码的应用程序

    【讨论】:

    • 您在哪里找到它仅适用于 PASSWORD() 的信息? Administrator Guidelines for Password Security 听起来像是一个示例列表(CREATE USER、GRANT、SET PASSWORD、PASSWORD),但不保证完整性。
    • 第五个选项 - 安排一个 cron 作业运行 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一起工作,因为它们不仅用于密码,而且是通用加密函数。
    • @DaveRandom 确实更好地描述了我的意思:只有当它知道它正在使用密码时,MySQL 才会不记录密码,例如 PASSWORD、CREATE、GRANT、.. .- 我怀疑 AES* 函数不会被记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2018-05-27
    • 2010-10-09
    • 2012-06-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多