您的位置:首页 > 编程语言 > Java开发

C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题

2011-07-26 20:22 288 查看
记得以前在学习Java的时候,Java的SQL中参数用?代替,今天突发奇想就拿着项目尝试着仿效这个功能。

只考虑非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();
}


  

源码文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐