在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)
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
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); //显示执行结果
}
//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#代码只供测试使用。
作者: XuGang 网名:钢钢 |
出处: http://xugang.cnblogs.com |
声明: 本文版权归作者和博客园共有。转载时必须保留此段声明,且在文章页面明显位置给出原文连接地址! |