sql关键字过滤C#方法

文章来源:sql关键字过滤C#方法


/// <summary>
///SQL注入过滤
/// </summary>
/// <param name="InText">要过滤的字符串</param>
/// <returns>如果参数存在不安全字符,则返回true</returns>
public  bool SqlFilter(string InText)
{
    string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join";
    if(InText==null)
        return false;
    foreach(string i in word.Split('|'))
    {
        if((InText.ToLower().IndexOf(i+" ")>-1)||(InText.ToLower().IndexOf(" "+i)>-1))
        {
            return true;
        }
    }
    return false;
}

1.
/// <summary>
    /// 过滤不安全的字符串
    /// </summary>
    /// <param name="Str"></param>
    /// <returns></returns>
    public static string FilteSQLStr(string Str)
    {

        Str = Str.Replace("'", "");
        Str = Str.Replace("\"", "");
        Str = Str.Replace("&", "&amp");
        Str = Str.Replace("<", "&lt");
        Str = Str.Replace(">", "&gt");

        Str = Str.Replace("delete", "");
        Str = Str.Replace("update", "");
        Str = Str.Replace("insert", "");

        return Str; 
    }

2.

#region 过滤 Sql 语句字符串中的注入脚本
        /// <summary>
        /// 过滤 Sql 语句字符串中的注入脚本
        /// </summary>
        /// <param name="source">传入的字符串</param>
        /// <returns>过滤后的字符串</returns>
        public static string SqlFilter(string source)
        {
            //单引号替换成两个单引号
            source = source.Replace("'", "''");

            //半角封号替换为全角封号,防止多语句执行
            source = source.Replace(";", ";");

            //半角括号替换为全角括号
            source = source.Replace("(", "(");
            source = source.Replace(")", ")");

            ///////////////要用正则表达式替换,防止字母大小写得情况////////////////////

            //去除执行存储过程的命令关键字
            source = source.Replace("Exec", "");
            source = source.Replace("Execute", "");

            //去除系统存储过程或扩展存储过程关键字
            source = source.Replace("xp_", "x p_");
            source = source.Replace("sp_", "s p_");

            //防止16进制注入
            source = source.Replace("0x", "0 x");

            return source;
        }
        #endregion

3.

/// 过滤SQL字符。
        /// </summary>
        /// <param name="str">要过滤SQL字符的字符串。</param>
        /// <returns>已过滤掉SQL字符的字符串。</returns>
        public static string ReplaceSQLChar(string str)
        {
            if (str == String.Empty)
                return String.Empty; str = str.Replace("'", "‘");
            str = str.Replace(";", ";");
            str = str.Replace(",", ",");
            str = str.Replace("?", "?");
            str = str.Replace("<", "<");
            str = str.Replace(">", ">");
            str = str.Replace("(", "(");
            str = str.Replace(")", ")");
            str = str.Replace("@", "@");
            str = str.Replace("=", "=");
            str = str.Replace("+", "+");
            str = str.Replace("*", "*");
            str = str.Replace("&", "&");
            str = str.Replace("#", "#");
            str = str.Replace("%", "%");
            str = str.Replace("$", "¥");

            return str;
        }
4.


/// <summary>
/// 过滤标记
/// </summary>
/// <param name="NoHTML">包括HTML,脚本,数据库关键字,特殊字符的源码 </param>
/// <returns>已经去除标记后的文字</returns>
public string NoHtml(string Htmlstring)
{
    if (Htmlstring == null)
    {
        return "";
    }
    else
    {
        //删除脚本
         Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);
        //删除HTML
        Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "xp_cmdshell", "", RegexOptions.IgnoreCase);

        //删除与数据库相关的词
         Htmlstring = Regex.Replace(Htmlstring, "select", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "insert", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "delete from", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "count''", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "drop table", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "truncate", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "asc", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "mid", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "char", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "xp_cmdshell", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "exec master", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "net localgroup administrators", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "and", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "net user", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "or", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "net", "", RegexOptions.IgnoreCase);
        //Htmlstring = Regex.Replace(Htmlstring, "*", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "-", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "delete", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "drop", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, "script", "", RegexOptions.IgnoreCase);

        //特殊的字符
         Htmlstring = Htmlstring.Replace("<", "");
        Htmlstring = Htmlstring.Replace(">", "");
        Htmlstring = Htmlstring.Replace("*", "");
        Htmlstring = Htmlstring.Replace("-", "");
        Htmlstring = Htmlstring.Replace("?", "");
        Htmlstring = Htmlstring.Replace("'", "''");
        Htmlstring = Htmlstring.Replace(",", "");
        Htmlstring = Htmlstring.Replace("/", "");
        Htmlstring = Htmlstring.Replace(";", "");
        Htmlstring = Htmlstring.Replace("*/", "");
        Htmlstring = Htmlstring.Replace("\r\n", "");
        Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();

        return Htmlstring;
   }
}

5.

public static bool CheckBadWord(string str)
{
string pattern = @"select|insert|delete|from|count\(|drop table|update|truncate|asc\(|mid\(|char\(|xp_cmdshell|exec   master|netlocalgroup administrators|net user|or|and";
if (Regex.IsMatch(str, pattern, RegexOptions.IgnoreCase))
return true;
return false;
}
public static string Filter(string str)
{
string[] pattern ={ "select", "insert", "delete", "from", "count\\(", "drop table", "update", "truncate", "asc\\(", "mid\\(", "char\\(", "xp_cmdshell", "exec   master", "netlocalgroup administrators", "net user", "or", "and" };
for (int i = 0; i < pattern.Length; i++)
{
str = str.Replace(pattern[i].ToString(), "");
}
return str;
}


<think>我们正在处理一个关于C#SQLServer查询关键字使用方法的问题。根据提供的引用,特别是引用[1]提到了C#2008新增的查询关键字(LINQ特性),引用[2]和[3]分别展示了C#操作SQLServer数据库的基础方法SQL语法在C#中的调用。用户需要的是查询关键字(即LINQ)的使用方法和示例。因此,我们将重点介绍LINQtoSQL,因为它是C#中用于查询SQLServer数据库的一种常用技术。###步骤分析:1.**理解LINQ**:LINQ(LanguageIntegratedQuery)允许在C#代码中直接使用类似SQL的查询语法。对于SQLServer,我们通常使用LINQtoSQL或EntityFramework。2.**基本查询关键字**:常见的查询关键字包括`from`,`where`,`select`,`orderby`,`groupby`,`join`等。3.**示例需求**:用户需要看到使用这些关键字的实际C#代码示例。###回答结构:-首先介绍LINQtoSQL的基本概念。-然后列举常用的查询关键字及其作用。-提供几个典型的使用示例(包括查询、条件过滤、排序、分组、连接等)。-最后给出相关参考资料(根据提供的引用)。###注意事项:-使用中文回答。-代码部分使用Markdown代码块。-独立公式(如果有数学表达式)使用`$$...$$`,但本问题可能不涉及。-生成相关问题。由于引用中提供了C#操作SQLServer的基础方法(如使用SqlConnection,SqlDataAdapter等),但用户明确要求查询关键字(即LINQ),因此我们将重点放在LINQ上,同时也可以简要提及传统的ADO.NET方法作为对比或补充。###回答内容:---#C#中使用LINQ查询SQLServer数据库在C#中,针对SQLServer数据库的查询可以使用**LINQtoSQL**技术,它允许您使用C#语言本身的关键字来编写查询,这些查询会被转换成SQL语句并在数据库上执行。LINQtoSQL提供了一种强类型、编译时检查的查询方式。##常用查询关键字以下是LINQ查询中常用的关键字及其功能:-`from`:指定数据源和范围变量(类似于SQL中的FROM子句)。-`where`:过滤条件(类似于SQL中的WHERE)。-`select`:指定查询结果的形式(类似于SQL中的SELECT)。-`orderby`:排序(类似于SQL中的ORDERBY)。-`groupby`:分组(类似于SQL中的GROUPBY)。-`join`:连接多个数据源(类似于SQL中的JOIN)。##使用步骤1.**创建数据上下文**:首先需要定义与数据库对应的数据上下文类(DataContext),该类通常由VisualStudio的ORM设计器自动生成,或者手动编写。2.**编写LINQ查询**:使用上述关键字编写查询表达式。3.**执行查询**:遍历查询结果或调用方法(如ToList())来执行查询。##示例###示例1:基本查询(select和where)假设我们有一个名为`Customers`的表,包含`CustomerID`,`CustomerName`,`City`等字段。```csharp//创建数据上下文using(vardb=newDataContext(connectionString)){//查询所有来自"北京"的客户varquery=fromcindb.Customerswherec.City=="北京"selectc;//执行查询并遍历结果foreach(varcustomerinquery){Console.WriteLine(customer.CustomerName);}}```###示例2:排序(orderby)按客户姓名升序排列:```csharpvarquery=fromcindb.Customersorderbyc.CustomerNameascendingselectc;```###示例3:分组(groupby)按城市分组统计客户数量:```csharpvarquery=fromcindb.Customersgroupcbyc.Cityintogselectnew{City=g.Key,Count=g.Count()};```###示例4:连接(join)假设有另一个表`Orders`,通过`CustomerID`关联。查询每个客户的订单数量:```csharpvarquery=fromcindb.Customersjoinoindb.Ordersonc.CustomerIDequalso.CustomerIDgroupobyc.CustomerNameintogselectnew{CustomerName=g.Key,OrderCount=g.Count()};```##传统ADO.NET方法(参考引用[2])如果您不使用LINQ,也可以使用传统的ADO.NET方法执行SQL查询,例如:```csharppublicDataSetQueryCustomers(stringcity){stringsql="SELECT*FROMCustomersWHERECity=@City";DataSetds=newDataSet();using(SqlConnectioncon=newSqlConnection(connectionString)){con.Open();SqlDataAdaptersda=newSqlDataAdapter(sql,con);sda.SelectCommand.Parameters.AddWithValue("@City",city);//参数化查询防止SQL注入sda.Fill(ds);con.Close();}returnds;}```##注意事项-使用LINQtoSQL时,务必注意数据上下文(DataContext)的生命周期,通常在一个using块中使用。-对于参数化查询,LINQtoSQL会自动处理参数,避免SQL注入。而在传统ADO.NET中,需要显式使用参数(如示例所示)[^2]。-创建表等DDL操作(如引用[3]所示)通常不通过LINQ执行,而是直接使用SQL命令。##引用说明-引用[1]介绍了LINQ(语言集成查询)的背景,它是C#2008新增的特性[^1]。-引用[2]展示了使用ADO.NET查询数据库的基本方法[^2]。-引用[3]提供了一个在C#中执行SQLDDL语句的示例[^3]。§§相关问题§§1.LINQtoSQL和EntityFramework有什么区别?2.如何防止SQL注入攻击?3.在C#中如何执行存储过程?4.如何优化LINQ查询的性能?5.如何使用异步方式执行数据库查询?---以上回答涵盖了用户所需的查询关键字(LINQ)的使用方法和示例,同时提供了传统方法的参考,并生成了相关问题。</think>### C# SQL Server 查询关键字及使用方法C#中操作SQL Server数据库时,**查询关键字**主要通过两种方式使用: 1. **LINQ(语言集成查询)**:C#内置的类SQL语法 2. **传统SQL命令**:直接执行SQL语句 --- #### 一、LINQ 查询关键字(推荐方式) LINQ提供类SQL的查询语法,编译时类型检查,避免SQL注入风险。核心关键字包括: ```csharp // 示例:查询员工表中工资>5000的北京员工 using (var db = new DataContext(connectionString)) { var query = from emp in db.Employees // from 指定数据源 where emp.Salary > 5000 // where 过滤条件 && emp.City == "北京" orderby emp.HireDate descending // orderby 排序 select new { // select 选择字段 emp.Name, emp.Department, emp.Salary }; foreach (var item in query.ToList()) { Console.WriteLine($"{item.Name}-{item.Department}"); } } ``` **关键操作符**: - `from`:定义数据源和范围变量 - `where`:条件过滤(支持`&&`、`||`) - `orderby`:排序(`ascending`/`descending`) - `select`:投影结果(支持匿名对象) - `join`:表连接(类似SQL JOIN) - `group by`:分组聚合 > 优势:编译时类型安全,智能提示,无缝集成C#逻辑[^1] --- #### 二、传统SQL查询方法 直接执行SQL语句(需注意防注入): ```csharp // 示例:参数化查询防止SQL注入 public DataSet QueryEmployees(string city, decimal minSalary) { string sql = @" SELECT Name, Department, Salary FROM Employees WHERE City = @City AND Salary > @MinSalary"; // 使用参数占位符 DataSet ds = new DataSet(); using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); using (SqlDataAdapter sda = new SqlDataAdapter(sql, con)) { // 添加参数 sda.SelectCommand.Parameters.AddWithValue("@City", city); sda.SelectCommand.Parameters.AddWithValue("@MinSalary", minSalary); sda.Fill(ds); // 执行查询填充DataSet } } return ds; } ``` **关键步骤**: 1. 使用`SqlConnection`建立连接 2. 通过`SqlDataAdapter`执行参数化SQL 3. 用`Parameters.AddWithValue()`防止注入 4. 结果存入`DataSet`或`DataTable`[^2] --- #### 三、动态SQL构建(Dapper示例) 使用轻量级ORM工具Dapper: ```csharp using Dapper; public IEnumerable<Employee> GetEmployees(string department) { using (var conn = new SqlConnection(connectionString)) { string sql = "SELECT * FROM Employees WHERE Department = @Dept"; return conn.Query<Employee>(sql, new { Dept = department }); } } ``` > 特点:高性能,直接映射到对象 --- ### 关键注意事项 1. **防SQL注入**: - 必须使用参数化查询(如`@param`) - 禁止字符串拼接:`"SELECT ... WHERE Name='" + name + "'"` ❌ 2. **连接管理**: - 使用`using`语句确保连接释放 - 连接字符串加密存储 3. **LINQ vs 原始SQL**: ```mermaid graph LR A[查询需求] -->|简单查询| B(LINQ) A -->|复杂报表| C(原始SQL) B --> D[编译时检查] C --> E[更高灵活性] ``` --- ### 典型应用场景 | **场景** | **推荐方式** | **示例** | |------------------------|-------------------|-----------------------------------| | 简单CRUD操作 | LINQ | `where`/`select`投影 | | 存储过程调用 | SqlCommand | `CommandType.StoredProcedure` | | 跨表复杂查询 | LINQ join | `from a in table1 join b in table2...` | | 大数据量批量操作 | SqlBulkCopy | 批量导入数据 | > 引用说明:LINQ特性在C# 2008中正式引入,实现了语言级查询能力[^1],而传统ADO.NET方法仍是基础操作的核心[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值