XuGang

记录一个程序员的成长

 

在C# 中如何让T-SQL 包含敏感的嵌入参数


在项目需求中,根据用户从文本框输入的表名,查询该表的记录数。初步代码如下:

     string sql = "select * from " + txtTableName.Text.Trim();  // txtTableName 是文本框


但这样有可能导致T-SQL注入式攻击,于是更改代码如下:
    string sql = "select * from @tb_name";
    cmd.Parameters.AddWithValue("@tb_name", txtTableName.Text.Trim());
    ...... 

 

执行,报错!!!
原因应该是:在T-SQL语句中,T-SQL关键字后面不能使用嵌入参数。


百度一番后,唯一值得参考的T-SQL语句,如下:

复制代码
declare @tbl_name varchar(50)
declare @result int
declare @sql varchar(500)
set @sql= 'select '+ str(@result+'=count(*) from '+@tbl_name
select @result as result
exec(@sql
复制代码


斟酌一番后,根据我的项目需求,编写了如下的T-SQL语句:

declare @tb_name varchar(50)
declare @sql nvarchar(500)
    
set @tb_name= 'student' --表名
     set @sql= 'select * from ' + @tb_name
   
exec sp_executesql @sql

注意:我这里使用了SQL Server的系统存储过程sp_executesql,详细介绍请查看MSDN。


应用到C#代码中如下:

复制代码
C#代码
//拖放两个控件如下:
//private System.Windows.Forms.Button btnQuery;      //“查询按钮”
//private System.Windows.Forms.TextBox txtTableName; //“表名文本框”

private void btnQuery_Click(object sender, EventArgs e)
{
     
string strCon = "server=.;database=winform;uid=sa;pwd=sa;";
     SqlConnection con = new SqlConnection(strCon);

     
/* ========================================
      * 原本想实现以下SQL语句:
      * string sql = "select * from @tb_name";
      * ====================================== */
     
string sql = "declare @sql nvarchar(500)";
           sql += "set @sql = 'select count(*) from ' + @tb_name ";
           sql += "exec sp_executesql @sql";

     SqlCommand cmd = new SqlCommand(sql, con);
             
     
//方法1
     cmd.Parameters.Add("@tb_name", System.Data.SqlDbType.VarChar);
     cmd.Parameters["@tb_name"].Value = txtTableName.Text.Trim();
     
//方法2
     
//cmd.Parameters.AddWithValue("@tb_name", txtTableName.Text.Trim());

     
/* ========================================
        上面的C#代码相当于如下T-SQL语句: 
            declare @tbl_name varchar(50)
                set @tbl_name='表名'
     ======================================== */

     con.Open();
     
string str = cmd.ExecuteScalar().ToString();
     con.Close();
     MessageBox.Show(str); //显示执行结果
}
复制代码

以上C#代码只供测试使用。

posted on   钢钢  阅读(2279)  评论(7编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

统计

点击右上角即可分享
微信分享提示