我有一个项目(私有的 ASP.net 网站,受 https 密码保护),其中要求之一是用户能够输入直接查询数据库的 Sql 查询。我需要能够允许这些查询,同时防止它们对数据库本身造成损坏,以及访问或更新它们不应该访问/更新的数据。
我制定了以下实施规则:
- 使用数据库用户only具有选择表/查看和更新表的权限(因此任何其他命令,如 drop/alter/truncate/insert/delete 将不会运行)。
- 验证语句是否以“Select”或“Update”开头
- 验证(使用正则表达式)语句中不存在未被单引号、空格和字母包围的分号实例。 (这里的想法是,它们可以包含第二个查询的唯一方法是以不属于输入字符串的分号结束第一个查询)。
- 验证(使用正则表达式)用户是否有权访问正在查询/更新的表、包含在联接中的表等。这包括任何子查询。 (实现此目的的部分方法是用户将使用数据库中实际不存在的一组表名,查询解析的一部分将是将正确的相应表名替换到查询中) 。
我错过了什么吗?
目标是用户能够以他们认为合适的任何方式查询/更新他们有权访问的表,并防止任何意外或恶意尝试损坏数据库。 (由于要求是用户生成 sql,所以我无法使用我所知道的任何内置工具来参数化查询或清理它)。
这是一个坏主意,不仅仅是从预防注射的角度来看。对于不了解情况的用户来说,很容易意外运行会占用所有数据库资源(内存/CPU)的查询,从而有效地导致拒绝服务攻击。
If you must如果允许,最好为这些查询保留一个完全独立的服务器,并使用复制来使其非常接近生产系统的精确镜像。当然,这不适用于您的 UPDATE 要求。
但我想再说一遍:这是行不通的。如果用户可以运行临时查询,您就无法保护您的数据库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)