【问题标题】:Executing shell command from MySQL从 MySQL 执行 shell 命令
【发布时间】:2008-11-14 12:17:08
【问题描述】:

我知道我正在寻找的可能是一个安全漏洞,但由于我设法在 Oracle 和 SQL Server 中做到了,我会试一试:

我正在寻找一种从 MySQL 上的 SQL 脚本执行 shell 命令的方法。如有必要,可以创建和使用新的存储过程。

注意:我不是在寻找 mysql 命令行工具提供的 SYSTEM 命令。相反,我正在寻找这样的东西:

开始 条件1... EXEC_OS cmd1;别的 EXEC_OS cmd2;结束;

EXEC_OS 是调用我的代码的方法。

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    这与其说是对问题的回答,不如说是对这种功能的证明——因此否定了那些会说“你应该做其他事情”或“你为什么想要”的人。

    我有一个数据库,我试图对其保持严格的规则——我不想在任何地方出现孤儿。参照完整性检查在表级别帮助我解决这个问题,但我必须将一些数据作为文件保存在文件系统中(这是我老板直接命令不要在数据库本身中存储任何二进制数据的结果)。

    这里明显的解决方案是有一个触发器,它在删除记录时触发,然后自动删除关联的外部文件。

    现在,我确实意识到 UDF 可能会提供一种解决方案,但似乎需要大量 C/C++ 工作才能简单地删除文件。当然,数据库权限本身至少会为潜在的攻击者提供一些安全性。

    现在,我确实意识到我可以编写一个 shell 脚本或类似的脚本来删除表记录,然后去删除相关文件,但同样,这超出了数据库的域 本身。正如一位老导师曾经告诉我的那样“业务的规则应该体现在数据库的规则中”。可以清楚地看到,我无法使用 MySQL 强制执行此操作。

    【讨论】:

      【解决方案2】:

      您可能需要考虑使用功能更强大的脚本语言编写脚本,例如 Perl、Python、PHP 或 Ruby。所有这些语言都有库来运行 SQL 查询。

      存储过程语言中没有用于运行 shell 命令的内置方法。这被认为是一个坏主意,不仅因为它是一个安全漏洞,而且因为 shell 命令的任何效果都不会遵守事务隔离或回滚,就像您在存储过程中执行的任何 SQL 操作的效果一样:

      START TRANSACTION;
      CALL MyProcedure();
      ROLLBACK;
      

      如果MyProcedure 做了诸如创建或编辑文件,或发送电子邮件等操作,这些操作将不会回滚。

      我建议您在存储过程中执行 SQL 工作,并在调用存储过程的应用程序中执行其他工作。

      【讨论】:

      • 这是一个虚假的学术论点!许多现实世界的问题不需要回滚能力。许多现实世界的问题都可以使用这种特性所支持的事件驱动处理类型。
      • @Alex R:这是一个有争议的问题,因为 MySQL 存储过程不支持运行 shell 命令。
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        根据forums.mysql.com上的this post,解决方案是使用MySQL_Proxy

        【讨论】:

          最近更新 更多