我有一个项目(私人,ASP.net 网站,密码保护 https),其中一个要求是用户能够输入将直接查询数据库的 Sql 查询。我需要能够允许这些查询,同时防止它们对数据库本身造成损害,以及访问或更新他们不应该能够访问/更新的数据。
我提出了以下实施规则:
- 使用只有Select Table/View 和 Update Table 权限的 db 用户(因此任何其他命令,如 drop/alter/truncate/insert/delete 都不会运行)。
- 验证语句是否以“Select”或“Update”开头
- 验证(使用正则表达式)语句中没有没有被单引号、空格和字母包围的分号实例。(这里的想法是,他们可以包含第二个查询的唯一方法是用不属于输入字符串的分号结束第一个查询)。
- 验证(使用正则表达式)用户有权访问正在查询/更新的表,包括在连接中等。这包括任何子查询。(实现这一点的部分方法是用户将使用一组实际上并不存在于数据库中的表名,部分查询解析将在正确的对应表名中替换为查询) .
我错过了什么吗?
目标是用户能够以他们认为合适的任何方式查询/更新他们有权访问的表,并防止任何意外或恶意尝试损坏数据库。(并且由于要求是用户生成 sql,因此我无法使用我知道的任何内置工具对查询进行参数化或清理)。