如何让应用程序用户安全地执行任意 SELECT 语句?
How to let app users execute arbitrary SELECT statements securely?
我想让应用程序的用户通过在文本框中输入查询来在应用程序的数据库上执行任意 SELECT
语句并且只执行 SELECT
语句。
必须过滤掉哪些关键字以确保安全,还应考虑哪些其他安全方面?
这是我已经想通的:
过滤掉以 CREATE
、ALTER
、DROP
、TRUNCATE
、UPDATE
、[=18= 开头的查询], INSERT
在分号处拆分用户输入并通过过滤器过滤所有单独的语句
还有什么要检查的吗?
谢谢!
简而言之,不要。无论您认为自己的 SQL 解析代码有多好,迟早有人,无论是否恶意,都会发现您未涵盖的内容。唯一 安全 方法是通过 SQL 服务器权限。即便如此,这也不一定是个好主意,因为有人可以轻松编写 SQL 来锁定数据库。
你能否回顾一下你的要求,看看用户是否真的需要能够执行任意查询。更有可能的是,他们想临时了解某些事情,在这种情况下,您可以提供在单击按钮时执行的固定查询,可能已参数化。
作为最后的手段,这不是建议,只是经验观察,给你的老板发邮件说这不安全,用户很容易使系统崩溃,但只要你的老板书面确认他们会承担责任然后你很乐意这样做。
我想让应用程序的用户通过在文本框中输入查询来在应用程序的数据库上执行任意 SELECT
语句并且只执行 SELECT
语句。
必须过滤掉哪些关键字以确保安全,还应考虑哪些其他安全方面?
这是我已经想通的:
过滤掉以
CREATE
、ALTER
、DROP
、TRUNCATE
、UPDATE
、[=18= 开头的查询],INSERT
在分号处拆分用户输入并通过过滤器过滤所有单独的语句
还有什么要检查的吗?
谢谢!
简而言之,不要。无论您认为自己的 SQL 解析代码有多好,迟早有人,无论是否恶意,都会发现您未涵盖的内容。唯一 安全 方法是通过 SQL 服务器权限。即便如此,这也不一定是个好主意,因为有人可以轻松编写 SQL 来锁定数据库。
你能否回顾一下你的要求,看看用户是否真的需要能够执行任意查询。更有可能的是,他们想临时了解某些事情,在这种情况下,您可以提供在单击按钮时执行的固定查询,可能已参数化。
作为最后的手段,这不是建议,只是经验观察,给你的老板发邮件说这不安全,用户很容易使系统崩溃,但只要你的老板书面确认他们会承担责任然后你很乐意这样做。