c# - 如何防止用户生成的 SQL 查询中的 SQL 注入(inject)

标签 c# asp.net sql regex sql-injection

我有一个项目(私有(private)的 ASP.net 网站,密码受 https 保护),其中一项要求是用户能够输入直接查询数据库的 Sql 查询。我需要能够允许这些查询,同时防止它们损坏数据库本身,并防止它们访问或更新它们不应访问/更新的数据。

我想出了以下实现规则:

  1. 使用有权选择表/查看和更新​​表的数据库用户(因此任何其他命令,如 drop/alter/truncate/insert/delete 将不会运行)。
  2. 验证语句是否以“Select”或“Update”开头
  3. 验证(使用正则表达式)语句中没有没有被单引号、空格和字母包围的分号实例。 (这里的想法是,他们可以包含第二个查询的唯一方法是以不属于输入字符串的分号结束第一个查询)。
  4. 验证(使用正则表达式)用户有权访问正在查询/更新的表,包括在连接中等。这包括任何子查询。 (实现这一点的部分方式是用户将使用一组实际上不存在于数据库中的表名,部分查询解析将在查询中替换正确的对应表名) .

我错过了什么吗?

目标是用户能够以他们认为合适的任何方式查询/更新他们有权访问的表,并防止任何意外或恶意破坏数据库的尝试。 (因为要求用户生成 sql,所以我无法使用我知道的任何内置工具来参数化查询或清理它)。

最佳答案

这是个坏主意,不仅仅是从防止注入(inject)的角度来看。对于一无所知的用户来说,很容易意外地运行一个会占用所有数据库资源(内存/CPU)的查询,从而有效地导致拒绝服务攻击。

如果您必须允许这样做,最好为这些查询保留一个完全独立的服务器,并使用复制使其非常接近您的生产系统的精确镜像。当然,这不适用于您的更新要求。

但是我想再说一遍:这根本行不通。如果用户可以运行即席查询,您就无法保护您的数据库。

关于c# - 如何防止用户生成的 SQL 查询中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444248/

相关文章:

C#:在将 DataTable 绑定(bind)到 GridView 时更改列的顺序

java - jOOQ:重用/复制查询

c# - 从带有前缀的 Azure Key Vault 获取所有 secret

c# - Windows Phone 8.1 RT Zxing.net 实现 : issue with CapturePhotoToStreamAsync

javascript - 动态添加点击事件到复选框,仅适用于第一个复选框JQUERY

c# - 如果 JSON 太大,如何停止处理

php - 获取同一列和单个 MySQL 查询中两个单独日期范围的值之和

sql - 从 R 运行 .sql 文件

c# - MVVM Light - 用户控件作为 View

c# - 在 MySQL 数据库上首先使用 EF 代码进行格式错误的迁移