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