如何禁用破坏性的数据库命令?

大多数系统pipe理员都会理解黑客对其pipe理的SQL数据库执行DROP或DELETE等破坏性命令的风险。 有没有办法彻底禁用这样的命令执行,也许通过configurationMySQL / MS SQL / PostgreSQL,或修改源代码,如果他们是开源的,删除这些危险的function。

Once you have your webapp online, would someone with honorable intentions ever need to DROP a table?! 

这可能是“主要”数据库安全性的圣杯解决scheme,而不是四处奔跑,试图阻止这些完全不必要的命令。 当然,在开发或可维护期间,可以重新启用,然后在不需要时closures。

SQL Server 2005中的DDL触发器可以禁止删除或修改表。

如果将与数据库的交互限制在存储过程中,则不必担心这一点。 应用程序帐户只能运行存储的特效 – 所以不会有sql注入的权限。

如果你不能这样做,那么你可以删除权限来删除和做任何types的DDL。 这总比没有好。 但是如果有人想要用空值来更新你所有的数据,他们可以。

如果您有宝贵的数据,您拥有一个保持最新的备份,否则您将发现自己无法工作/业务。

你不需要修改数据库代码,因为这已经存在。 只是人们不使用它。 大多数networking应用至多需要插入,select,更新,删除和创build的能力。 许多安装过程都会逐步完成使用特权用户创build所需帐户和数据库的过程。 IIRC mediawiki做得很好。

然而,我无法计算我发现的Web应用程序的数量,其中Web应用程序数据库用户具有其数据库的完整权限,或最糟糕的是整个数据库安装。 另外一些应用程序的构build方式需要太多权限。 或者不要使用内部特权帐户和非特权帐户来pipe理pipe理function。

听起来像你可能想要检查数据库防火墙。 GreenSQL是一个开源的: http : //www.greensql.net/

干杯

是的,当我的数据库正在生产时,我可能需要删除我创build的临时表。

如果你确实是偏执的人,你应该让开发人员使用视图和存储过程,这样通常可以访问表的帐户不能直接操作,而必须通过视图/过程访问它们。

至less在MySQL中,您不必为帐户创build和删除表格。 花一些时间,看看权限系统,只是正确地限制你的帐户。

另一个select,你可以使用代价性能将是通过与一个偏执的filter,阻止你不喜欢的一切的MySQL代理运行的所有访问。

这与文件访问没有区别。 用户帐户应具有完成此项工作所需的绝对最低权限。 像drop这样的权限只能授予pipe理员级别的帐户,除非这是绝对不可避免的,在这种情况下,应该对应用程序devise进行审查。 删除通常是必需的,但应该仅限于那些需要的表格。

如果在授予权限时使用谨慎和常识,则不需要修改代码。 彻底清除潜在的危险命令可能会导致不可维护的数据库系统。

我们所做的是将所有人添加到db_denydatawriterangular色(仅适用于SQLServer),该angular色将删除任何插入,更新和删除权限。

然后,我们通过存储过程来控制我们所有的Web用户对数据库的访问。 假如你不给他们权限来创build他们自己的存储过程,并且假设你不允许他们在存储过程中执行任意SQL,那么你已经很好地locking了。

这超出了不能删除表,但是如果你没有在任何地方使用存储过程,那么你可能会面临转换你的代码的大战。