从MySQL执行shell命令
我知道我正在寻找的可能是一个安全漏洞,但由于我在Oracle和SQL Server中成功地做到了这一点,我将尝试一下: 我正在寻找一种从MySQL上的SQL脚本执行shell命令的方法。如有必要,可以创建并使用新的存储过程 注意:我不是在寻找mysql命令行工具提供的系统命令。相反,我在寻找这样的东西: 如果开始 条件1。。。 EXEC_OS cmd1;其他的 EXEC_OS cmd2;结束从MySQL执行shell命令,mysql,database,stored-procedures,Mysql,Database,Stored Procedures,我知道我正在寻找的可能是一个安全漏洞,但由于我在Oracle和SQL Server中成功地做到了这一点,我将尝试一下: 我正在寻找一种从MySQL上的SQL脚本执行shell命令的方法。如有必要,可以创建并使用新的存储过程 注意:我不是在寻找mysql命令行工具提供的系统命令。相反,我在寻找这样的东西: 如果开始 条件1。。。 EXEC_OS cmd1;其他的 EXEC_OS cmd2;结束 其中EXEC_OS是为我的代码开具发票的方法。根据forums.mysql.com上的说法,解决方案是使
其中EXEC_OS是为我的代码开具发票的方法。根据forums.mysql.com上的说法,解决方案是使用在中,你可以考虑用更为专业的脚本语言编写脚本,如Perl、Python、PHP或Ruby。所有这些语言都有运行SQL查询的库 存储过程语言中没有用于运行shell命令的内置方法。这被认为是一个坏主意,不仅因为这是一个安全漏洞,而且因为shell命令的任何效果都不遵守事务隔离或回滚,就像您在存储过程中执行的任何SQL操作的效果一样:
START TRANSACTION;
CALL MyProcedure();
ROLLBACK;
如果MyProcedure
执行了创建或编辑文件、发送电子邮件等操作,则这些操作不会回滚
我建议您在存储过程中执行SQL工作,并在调用存储过程的应用程序中执行其他工作。这与其说是对这个问题的回答,不如说是对这种功能的辩护——因此否定了那些会说“您应该做其他事情”或“您为什么要做”的人 我有一个数据库,我试图保持严格的规则-我不希望孤儿在任何地方。引用完整性检查可以在表级别帮助我实现这一点,但我必须将一些数据作为文件保存在文件系统中(这是老板直接命令我不要在数据库本身中存储任何二进制数据的结果) 这里显而易见的解决方案是有一个触发器,在删除记录时触发,然后自动删除关联的外部文件 现在,我确实意识到UDF可能提供了一个解决方案,但这似乎需要大量的C/C++工作来简单地删除一个文件。当然,数据库权限本身至少可以提供一些来自潜在攻击者的安全性
现在,我确实意识到我可以编写一个shell脚本或类似的脚本来删除表记录,然后再删除相关文件,但这又超出了数据库本身的范围。正如一位老讲师曾经告诉我的那样,“业务规则应该反映在数据库规则中”。可以清楚地看到,我无法使用MySQL强制执行此操作。这是一个虚假的学术论点!许多实际问题不需要回滚功能。许多实际问题可能会使用这种功能所启用的事件驱动处理。@Alex R:这是一个没有实际意义的问题,因为MySQL存储过程无论如何都不支持运行shell命令。