winform防止sqlserver注入_防止SQL注入

本文介绍了如何在WinForm应用中防止SQL Server注入攻击。提供了两个代码区域,第一部分展示了在UI层如何通过正则表达式检查用户输入是否包含SQL关键字,如果发现则阻止请求。第二部分提供了解码和编码方法,用于在业务逻辑层处理输入和输出,将SQL敏感字替换为安全格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.[代码][C#]代码

#region 防止sql注入式攻击(可用于UI层控制)

///

/// 判断字符串中是否有SQL攻击代码

///

/// 传入用户提交数据

/// true-安全;false-有注入攻击现有;

public bool ProcessSqlStr(string inputString)

{

string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\*|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";

try

{

if ((inputString != null) && (inputString != String.Empty))

{

string str_Regex = @"\b(" + SqlStr + @")\b";

Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);

//string s = Regex.Match(inputString).Value;

if (true == Regex.IsMatch(inputString))

return false;

}

}

catch

{

return false;

}

return true;

}

///

/// 处理用户提交的请求,校验sql注入式攻击,在页面装置时候运行

/// System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString(); 为用户自定义错误页面提示地址,

/// 在Web.Config文件时里面添加一个 ErrorPage 即可

///

///

///

public void ProcessRequest()

{

try

{

string getkeys = "";

string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString();

if (System.Web.HttpContext.Current.Request.QueryString != null)

{

for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)

{

getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];

if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))

{

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");

System.Web.HttpContext.Current.Response.End();

}

}

}

if (System.Web.HttpContext.Current.Request.Form != null)

{

for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)

{

getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];

if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))

{

System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");

System.Web.HttpContext.Current.Response.End();

}

}

}

}

catch

{

// 错误处理: 处理用户提交信息!

}

}

#endregion

#region 转换sql代码(也防止sql注入式攻击,可以用于业务逻辑层,但要求UI层输入数据时候进行解码)

///

/// 提取字符固定长度

///

///

///

///

public string CheckStringLength(string inputString, Int32 maxLength)

{

if ((inputString != null) && (inputString != String.Empty))

{

inputString = inputString.Trim();

if (inputString.Length > maxLength)

inputString = inputString.Substring(0, maxLength);

}

return inputString;

}

///

/// 将输入字符串中的sql敏感字,替换成"[敏感字]",要求输出时,替换回来

///

///

///

public string MyEncodeInputString(string inputString)

{

//要替换的敏感字

string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\*|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";

try

{

if ((inputString != null) && (inputString != String.Empty))

{

string str_Regex = @"\b(" + SqlStr + @")\b";

Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);

//string s = Regex.Match(inputString).Value;

MatchCollection matches = Regex.Matches(inputString);

for (int i = 0; i < matches.Count; i++)

inputString = inputString.Replace(matches[i].Value, "[" + matches[i].Value + "]");

}

}

catch

{

return "";

}

return inputString;

}

///

/// 将已经替换成的"[敏感字]",转换回来为"敏感字"

///

///

///

public string MyDecodeOutputString(string outputstring)

{

//要替换的敏感字

string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\*|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";

try

{

if ((outputstring != null) && (outputstring != String.Empty))

{

string str_Regex = @"\[\b(" + SqlStr + @")\b\]";

Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);

MatchCollection matches = Regex.Matches(outputstring);

for (int i = 0; i < matches.Count; i++)

outputstring = outputstring.Replace(matches[i].Value, matches[i].Value.Substring(1, matches[i].Value.Length - 2));

}

}

catch

{

return "";

}

return outputstring;

}

#endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值