我目前正在编写一个主要由开发人员使用的网络应用程序,我认为(根据个人经验)有时候以不受限制的方式运行自定义搜索会很方便。我想让我的用户对他们的个人数据进行任意多语句SQL搜索(需要额外付费),这样他们就可以检索当时与他们的问题相关的数据。
显然,这是需要非常谨慎的事情,所以我想确保我能以正确的方式解决这个问题。
我认为,主要关注点是:
最安全的方法是如何安全地为用户提供这种能力?
答案 0 :(得分:9)
这是危险区域(我强烈建议您仔细权衡此要求,因为您将面临明显的危险),但我将尽力为您提供最安全的方式如果你必须的话。
我在这里做的唯一假设是你正在运行当前版本的PostgreSQL,并且你需要用户远程连接到服务器(使用他们自己的工具)来执行他们的自定义查询。即使他们将他们输入到网页中,只要他们每个人都有一个单独的用户登录数据库服务器,大多数相同的技术仍将适用。
首先,(正如NoBugs所指出的)为了防止用户执行明显的恶意语句(如UPDATES,DELETES,DROPS等),您需要确保连接到服务器的用户帐户只对数据库具有SELECT权限和他们应该能够阅读的表格。查看手册以了解如何为用户定义角色,并为这些角色授予特定权限。
http://www.postgresql.org/docs/9.0/static/user-manag.html http://www.postgresql.org/docs/9.0/static/database-roles.html
请注意,您只能将用户限制为特定的表格。如果 然后,每个用户都需要访问表的不同部分 PostgreSQL(以及几乎所有的DBMS)都不会支持这个 框。您唯一的选择是尝试创建某种SQL / TCP 拦截请求的代理,并以某种方式修改它们以限制 查询结果,然后传递给数据库服务器。这将是 即使是非常有经验的开发人员也非常困难!
为了防止(或至少检测到)DOS攻击,您需要一个外部脚本或进程来每隔几秒钟监视数据库(和/或整个服务器)的资源使用情况,并可能构建一个如果最大化,重启PostgreSQL服务的机制。
您需要先进行实验,然后再进行干预 仔细,因为合法查询很可能达到最大值 事情几秒钟。
如你所说,你需要仔细记录谁试图执行什么,&如果有的话,如果有必要,你可以从失败中倒退,找出罪魁祸首。实际上,您只能依赖系统日志,可以将其配置为写出文件,CSV或Syslog。
我建议您预先创建一些工具来帮助您快速搜索 这些日志可以在您需要尝试找到之前找到所需的内容 (双关语)。
最后,您还应该尝试遵循其他标准的管理和安全最佳实践(所有这些都可以在手册中找到),包括:
答案 1 :(得分:0)
确保用户sql正在运行,因为只有用户应该能够修改的表/文件的权限。
还有一些其他注意事项 - 只允许可信输入(可能在api调用中使用https?)并且知道Mysql可以访问您不想让它访问的文件和内容。
另请参阅:http://www.greensql.com/article/protect-yourself-sqli-attacks-create-backdoor-web-server-using-mysql