我已经inheritance了一个非常不安全的PHP Web应用程序,有一个SQL注入的历史。 我不能立即修复这些脚本,而是需要他们运行才能运行网站,并且首先从php端处理php脚本过多。 不过,我确实可以完全控制服务器和服务器上的软件,包括完全控制mysql数据库及其用户。
让我们估计一下总共300个脚本,40个半私有脚本和20个私有/安全脚本。
所以我的问题是如何最好的保护数据,隐含的假设,从PHP方面的SQL注入(例如在300个脚本列表中的某处)是不可避免的?
我的第一个草案计划是在mysql数据库中创build多个不同权限的用户层。 通过这种方式,我可以确保数据和脚本最需要保护第一(“私人/安全”类别),然后是第二层数据库表和脚本(“半私人”),最后处理安全性其余的PHP应用程序总体上(最终确保数据库表,基本上处理“公共”信息,例如,甚至只是查看主页需要)的结果。
因此,3个数据库用户(公用,半专用和安全)使用不同的用户连接三组不同的脚本(安全脚本,半私有脚本和公用脚本)。 通过这种方式,我可以阻止所有对“公开”或“半私人”的“安全”访问,以及“公开”的“半私密”访问。 还有其他的select,我应该看看? 如果一个分层的接入系统是一条路,那么最好的方法是什么?
简单的答案是:“在数据库级别上,不能真正防范SQL注入”。 一旦他们连接到数据库手中的查询你的数据库将执行它 – 如果有人已经注入到SQL的最坏,你可以希望做的是减轻他们可以做的损害。
就减less损害而言,您已经描述了一个很好的方法:将每个脚本限制为使用数据库用户帐户,该帐户仅限于脚本所需的最小访问权限(select,插入,更新,删除和仅限于特定的表脚本一定要碰)。
这不能保护你的数据库免受SQL注入攻击 – 它只是基于它们被入侵的脚本限制了某人可以窃取(或销毁)的数据量。 一个坚定的攻击者可能会首先攻击那些“有趣”的脚本,这些脚本首先要有他们想要的多汁的数据。
就不可预见的问题而言,分离到用户angular色可能只提供最小的安全收益(如果有许多复杂的交叉表查询和脚本可以做多件事情)可能会导致服务器崩溃( 特别是如果您有很多复杂执行多个事务的脚本的交叉查询)。
值得注意的是,在这个级别审计数据库可能需要花费很多时间(如果不是更多的话),而是用适当的参数化查询来replace所有当前的调用,从而使SQL注入攻击变得困难或不可能。
我build议你看看PHP-IDS http://phpids.org/ 。 它不会成为保证脚本的替代品,也不会阻止所有的攻击,但是如果你必须使用安全的方式,那么这是一个非常棒的方法。 它会阻止黑客的方便,并让他们继续下一个目标。 这不会阻止任何人的决定。
它会尽最大努力猜测:
与mod_security相结合,将会非常有帮助。
您的分区策略是100%正确的。 不过可以考虑SQL注入之外,因为如果他们在那里有可能是其他types的攻击。 特权海拔或会话劫持? 您可能会发现分区比首先想象的更难,这取决于网站devise的性质。
最终咬住子弹,只是重新编码,这是需要发生的事情。
apache或IDS / IPS硬件防火墙模块的mod_security将对请求进行分析,阻止潜在的SQL注入。 但我相信其他评论者会详细解释风险。
你需要GreenSQL 。 我自己从来没有用过 – 无论如何,在生产环境中,但它充当MySQL的查询,并过滤掉指示SQL注入的危险查询。
您可以(如果您拥有天赋,时间或资源)编写位于数据库和PHP脚本之间的数据库代理,并筛选出可疑的SQL查询。 如果所有或大部分PHP脚本都调用相同的数据库API库,那么我build议在那里实现filter。 一定要创build补丁文件(使用差异),所以如果您的PHP DB API得到更新,您可以重新应用您的更改。
您可以使用Mysql Proxy来即时validation/修改所有请求。 可能很难防止D的数据挖掘,例如你可以至less删除所有的DROP。