You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#读取.txt文件中SQL查询时禁止执行DML操作?

防止执行DML操作的实用方案

要确保从txt读取的SQL只做查询操作、不执行DML(INSERT/UPDATE/DELETE/MERGE/TRUNCATE等),可以从代码校验、数据库权限、预执行验证这几个层面入手,结合使用效果最好:

  • 静态文本校验(快速拦截)
    读取SQL文本后,先做关键字检查,过滤掉DML相关的命令。注意要处理注释和整词匹配,避免误判字段名里的关键字:

    string rawSql = File.ReadAllText("query.txt");
    // 先移除SQL注释(简单处理,复杂场景可考虑专业SQL解析库)
    string cleanedSql = Regex.Replace(rawSql, @"(--.*?$|/\*.*?\*/)", "", RegexOptions.Multiline | RegexOptions.Singleline);
    // 检查是否包含DML关键字
    var dmlPattern = new Regex(@"\b(INSERT|UPDATE|DELETE|MERGE|TRUNCATE)\b", RegexOptions.IgnoreCase);
    if (dmlPattern.IsMatch(cleanedSql))
    {
        throw new InvalidOperationException("查询包含禁止的修改操作");
    }
    

    这种方法能快速拦截大部分明显的DML,但如果有人刻意绕过(比如拆分关键字),就得靠后面的方法补防。

  • 数据库权限限制(最可靠的底层防护)
    给执行查询的数据库账号只分配SELECT权限,撤销或不赋予INSERT、UPDATE、DELETE、ALTER等修改类权限。就算SQL里藏了DML,数据库也会直接返回权限错误,从根源上阻止执行。这是最稳妥的方案,建议作为核心防护手段。

  • 预执行验证(数据库层面校验)
    用数据库自带的工具提前判断SQL类型,比如SQL Server可以用sys.dm_exec_describe_first_result_set函数,它只能解析会返回结果集的查询,如果是DML操作(比如纯INSERT),执行这个函数会报错:

    string checkSql = $"SELECT * FROM sys.dm_exec_describe_first_result_set(N'{rawSql.Replace("'", "''")}', NULL, 0)";
    using (var conn = new SqlConnection("你的连接字符串"))
    {
        conn.Open();
        try
        {
            var cmd = new SqlCommand(checkSql, conn);
            cmd.ExecuteReader();
        }
        catch (SqlException ex)
        {
            // 出现错误说明不是合法的查询语句
            throw new InvalidOperationException("查询包含非法操作", ex);
        }
    }
    

    执行完这个校验后,再执行实际的查询,能进一步确保安全性。

  • 执行时限定查询类型
    执行SQL时,只使用ExecuteReader()或ExecuteScalar()这类用于查询的方法,避免使用ExecuteNonQuery()(后者常用于执行DML)。虽然这不能完全阻止DML,但能避免误操作。


内容的提问来源于stack exchange,提问作者peaky221b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:57:25