SQL容易打针?
SQL injection prone?
我正在使用 Django 构建一个网站,其中将有一个 sql 控制台用于对数据库 (SQLite3) 执行原始查询。
我知道这是一个危险的想法,这就是为什么我想知道我相当不优雅和粗暴的解决方案是否可行。
我希望用户只能执行 SELECT 语句,因此在对数据库执行查询之前,我只是简单地创建一个断言语句来检查 'DROP'、'UPDATE' 或 'CREATE' 不在查询字符串中,另一个断言单词 'SELECT' 是。
如果不满足,则不处理查询。
它够好还是我遗漏了什么?
如果您对自己的代码有足够的信心,那可能会工作得很好。就个人而言,我永远不会那么自信。
在用户或文件级别切断权限可能会更好,因为sqlite根本没有用户,我们可以在文件级别切断写权限。
从 here 可以看出,如果它所在的数据库或文件夹不允许写入权限,那么它们将无法执行 INSERT、UPDATE、DELETE 等操作
从用户体验和安全的角度来看,您还应考虑以下几点:
(A) 这应该是像 PHPAdmin 这样的应用程序,我们在其中谈论一个用户连接到他们自己的数据库吗?
(B) 这是一个封闭的应用程序,所有用户作为一个团队在同一个表上工作,如果数据被破坏,这将以同样的方式影响所有用户吗?你真的必须对团队有信心,他们不想通过在 Django 的身份验证表中钓鱼来互相欺负。
(C) 或者这是一个开放注册到 public 的应用程序,每个用户在他们自己的表上工作,并且不应该通过影响对 django 至关重要的表来降低系统的最小可能性(比如 auth_*
)。
如果这是关于 (C) 而不是 (A),那么请不要这样做。如果它是 (B) 而不是 (A),即使那样 - 也不要。如果这是一个付费项目并且你必须保证数据库不会被嗅探或损坏并且你不想编写自己的 SQL 解析器并进行足够的安全测试 - 你应该好好考虑这种类型功能。
或者:
使用 Django 作为工具,并根据您的业务需求,创建复杂表单可能是一个有效的选择,用户可以从中 select Django 模型(:= sql 表) 和过滤器(:= joins/where 子句)来创建自己的报告。
如果这是关于报告工具 - 您可能想查看 Django 的现有报告模块以及 Django Admin 提供的可能性。
我正在使用 Django 构建一个网站,其中将有一个 sql 控制台用于对数据库 (SQLite3) 执行原始查询。
我知道这是一个危险的想法,这就是为什么我想知道我相当不优雅和粗暴的解决方案是否可行。
我希望用户只能执行 SELECT 语句,因此在对数据库执行查询之前,我只是简单地创建一个断言语句来检查 'DROP'、'UPDATE' 或 'CREATE' 不在查询字符串中,另一个断言单词 'SELECT' 是。
如果不满足,则不处理查询。
它够好还是我遗漏了什么?
如果您对自己的代码有足够的信心,那可能会工作得很好。就个人而言,我永远不会那么自信。
在用户或文件级别切断权限可能会更好,因为sqlite根本没有用户,我们可以在文件级别切断写权限。
从 here 可以看出,如果它所在的数据库或文件夹不允许写入权限,那么它们将无法执行 INSERT、UPDATE、DELETE 等操作
从用户体验和安全的角度来看,您还应考虑以下几点:
(A) 这应该是像 PHPAdmin 这样的应用程序,我们在其中谈论一个用户连接到他们自己的数据库吗?
(B) 这是一个封闭的应用程序,所有用户作为一个团队在同一个表上工作,如果数据被破坏,这将以同样的方式影响所有用户吗?你真的必须对团队有信心,他们不想通过在 Django 的身份验证表中钓鱼来互相欺负。
(C) 或者这是一个开放注册到 public 的应用程序,每个用户在他们自己的表上工作,并且不应该通过影响对 django 至关重要的表来降低系统的最小可能性(比如 auth_*
)。
如果这是关于 (C) 而不是 (A),那么请不要这样做。如果它是 (B) 而不是 (A),即使那样 - 也不要。如果这是一个付费项目并且你必须保证数据库不会被嗅探或损坏并且你不想编写自己的 SQL 解析器并进行足够的安全测试 - 你应该好好考虑这种类型功能。
或者:
使用 Django 作为工具,并根据您的业务需求,创建复杂表单可能是一个有效的选择,用户可以从中 select Django 模型(:= sql 表) 和过滤器(:= joins/where 子句)来创建自己的报告。
如果这是关于报告工具 - 您可能想查看 Django 的现有报告模块以及 Django Admin 提供的可能性。