C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题
2011-07-26 20:22
288 查看
记得以前在学习Java的时候,Java的SQL中参数用?代替,今天突发奇想就拿着项目尝试着仿效这个功能。
只考虑非IN的情况下,以?挖坑替代参数。
例如:SELECT name,age FROM UserInfo WHERE name = ?
代码如下:
将传入的SQL语句中的?转换为@name的参数名,并生成对应的SqlParameter[]。
然后如果考虑SQL中有IN的情况下,我们一般的做法是通过拼接的方式进行,然后拼接存在着"'"这个符号,对于SQL的注入还是很危险的。我们可以将多个值转换为多个参数的形式替换SQL语句,例如:SELECT name,age FROM UserInfo WHERE name IN ('小明','小王','小李')的情况下,我们可以将SQL定义为SELECT name,age FROM UserInfo WHERE name IN (@name1,@name2,@name3)的形式,然后根据传入的值,处理出相应的SqlParameter.
代码如下:
源码文件
只考虑非IN的情况下,以?挖坑替代参数。
例如:SELECT name,age FROM UserInfo WHERE name = ?
代码如下:
/// <summary> /// 转化单数参数 /// </summary> /// <param name="sql">需要处理的Sql</param> /// <param name="paramValues">参数值数组</param> /// <returns></returns> public SqlParameter[] CastSingleUnknow(ref string sql, object[] paramValues) { //当sql存在问号参数,则根据参数创建SqlParameter并替换sql内的问号标识 IList<SqlParameter> parameterList = new List<SqlParameter>(); if(0 <= sql.IndexOf("?") && paramValues != null && 0 < paramValues.Length) { sql = new Regex(@"\?").Replace(sql, mark => { string paramName = this.SINGLE_PARAM + this.ParamIndex; if(this.ParamIndex < paramValues.Length) { parameterList.Add(new SqlParameter(paramName, paramValues[this.ParamIndex++])); } else { throw new Exception("参数值数量小于问号参数数量!"); } return paramName; }); } return parameterList.ToArray(); }
将传入的SQL语句中的?转换为@name的参数名,并生成对应的SqlParameter[]。
然后如果考虑SQL中有IN的情况下,我们一般的做法是通过拼接的方式进行,然后拼接存在着"'"这个符号,对于SQL的注入还是很危险的。我们可以将多个值转换为多个参数的形式替换SQL语句,例如:SELECT name,age FROM UserInfo WHERE name IN ('小明','小王','小李')的情况下,我们可以将SQL定义为SELECT name,age FROM UserInfo WHERE name IN (@name1,@name2,@name3)的形式,然后根据传入的值,处理出相应的SqlParameter.
代码如下:
/// <summary> /// 转化数组参数 /// </summary> /// <param name="sql">需要处理的Sql</param> /// <param name="paramValues">参数值数组</param> /// <returns></returns> public SqlParameter[] CastArrayUnknow<T>(ref string sql, T[] paramValues) where T : struct { //当sql存在问号参数,则根据参数创建SqlParameter并替换sql内的问号标识 IList<SqlParameter> parameterList = new List<SqlParameter>(); if(0 <= sql.IndexOf("?") && paramValues != null && 0 < paramValues.Length) { IList<string> paramNameList = new List<string>(); int count = paramValues.Length; for(int i = 0;i < count;i++) { string paramName = this.ARRAY_PARAM + i; paramNameList.Add(paramName); parameterList.Add(new SqlParameter(paramName, paramValues[i])); } sql = sql.Replace("?", string.Format(0 <= sql.IndexOf("(?)") ? "{0}" : "({0})", string.Join(",", paramNameList.ToArray()))); } return parameterList.ToArray(); }
源码文件
相关文章推荐
- C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题(续)
- "java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 12"异常问题的解决
- 解决SQL中in参数在存储过程中的传递有关问题
- 解决SQL中in参数在存储过程中的传递问题
- java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1解决办法
- sql 与java 连接 的问题 及解决方法
- C# SQL语句执行时间过长在操作完成之前超时时间已过或服务器未响应问题的解决
- msssql 用numberic(38)替代int去解决int不够的问题
- java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法
- “索引中丢失 IN 或 OUT 参数”问题解决办法
- java.sql.SQLException: 索引中丢失 IN 或 OUT 参数::
- 【java】怎样解决tomcat中get提交中文参数为乱码的问题
- tomcat请求参数问题解决: Invalid character found in the request target. The valid characters are defined in
- java.lang.UnsupportedClassVersionError: Bad version number in .class file 问题解决办法.
- 解决java插入mysql时出现java.sql.SQLException: Incorrect string value: '\xF0...'问题
- 关于spring boot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案
- (转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题
- Caused by: java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 2
- JAVA解决在@autowired,@Resource注入为null的问题
- 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)