在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#代码中如下:

复制代码
ExpandedBlockStart.gif 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#代码只供测试使用。




本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2010/06/04/1751340.html,如需转载请自行联系原作者

相关文章
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
65 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
3月前
|
存储 编解码 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)
37 0
|
6月前
|
SQL 数据库
解决SQL报错提供了过多的参数,最多应为 2100
解决SQL报错提供了过多的参数,最多应为 2100
169 0
|
30天前
|
开发框架 小程序 .NET
C#动态生成带参数的小程序二维码
C#动态生成带参数的小程序二维码
|
1月前
|
SQL 数据库 索引
解决SQL报错:索引中丢失IN或OUT參数
解决SQL报错:索引中丢失IN或OUT參数
|
1月前
|
SQL Java 数据库连接
Mybatis拦截器实现带参数SQL语句打印
Mybatis拦截器实现带参数SQL语句打印
|
1月前
|
SQL JSON 运维
dataworks常见问题之selectdb前置sql参数无法获取如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
28 0
|
2月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
3月前
|
SQL 缓存 Java
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
64 0
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
|
3月前
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
43 0