Lia*_*son 4 c# sql security postgresql
我目前正在编写一个主要由开发人员使用的Web应用程序,我认为(根据个人经验)有时候以不受限制的方式运行自定义搜索会很方便.我想让我的用户在他们的个人数据上运行任意多语句SQL搜索(需要额外付费),这样他们就可以检索当时与他们的问题相关的数据.
显然,这是需要非常谨慎的事情,所以我想确保我将以正确的方式解决这个问题.
我认为,主要关注点是:
最安全的方法是如何安全地为用户提供这种能力?
小智 9
这是一个危险的领域(我强烈建议你仔细权衡这个要求,因为你将面临明显的危险),但是如果必须的话,我会尽量给你最安全的方法.
我在这里做的唯一假设是你正在运行当前版本的PostgreSQL,并且你需要用户远程连接到服务器(使用他们自己的工具)来执行他们的自定义查询.即使他们将他们输入到网页中,只要他们每个人都有一个单独的用户登录数据库服务器,大多数相同的技术仍将适用.
首先,(如NoBugs所指出的)为了防止用户执行明显的恶意语句(如UPDATES,DELETES,DROPS等),您需要确保连接到服务器的用户帐户只对db(s)和table具有SELECT权限( s)他们应该能够阅读.查看手册以了解如何为用户定义角色,并为这些角色授予特定权限.
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.
我建议你预先创建一些工具来帮助你快速搜索这些日志,找到你需要的东西,然后再尝试找到它(双关语).
最后,您还应该尝试遵循管理和安全性的其他标准最佳实践(所有这些都可以在手册中找到),包括: