在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#代码只供测试使用。




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

相关文章
|
1月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
32 10
|
2月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
545 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
1月前
|
API C# Windows
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
75 0
|
3月前
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
83 1
|
3月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
78 0
|
3月前
|
API C#
SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景
SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景
103 0
|
4月前
|
SQL 数据库 Python
【Python】已完美解决:(executemany()方法字符串参数问题)more placeholders in sql than params available
【Python】已完美解决:(executemany()方法字符串参数问题)more placeholders in sql than params available
76 1
|
5月前
|
SQL DataWorks 关系型数据库
DataWorks产品使用合集之如何将硬编码的配置值(例如SQL查询中的固定值)更改为调度参数
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
76 7
|
4月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
4月前
|
SQL Cloud Native 关系型数据库
云原生数据仓库使用问题之控制JDBC方式请求的SQL大小限制的参数是什么
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。