其实对已sqlserver,最彻底的防SQL注入的方式就是对每个数据库设定一个用户,而对这个用户设置具体的权限,不过比较麻烦。
一、在对Get方法传参的时候;
如果是整型的参数:用
try{
int para = int.Parse(Request.QueryString["id"].ToString());
}catch(Exception ex){
}
如果是字符串的参数:只需要替换掉单引号即可:
string pata = Request.QueryString["id"].ToString().Replace("'","");
如果涉及到分页的话
我的做法一般就是:
Get传过来的参数是作为硬性的查询条件:
而把查询的项构造成一个查询字符串存放在页面的隐藏域上;
此时对于SQL注入的防范方法就是先把这个隐藏域中的单引号转化成其它的格式:如@
然后在使用的时候再转回来。
就在绑定的时候:
protected void BindDataProject() {
//把一些会导致严重后果的特殊字符替换成再也不会形成特殊字符的句子:xyz;以防有的人用:drodropp的形式的时候,把中间的drop 替换掉之后却形成了另一个drop
Hiddenfield.Value = Regex.Replace(Hiddenfield.Value, @"'|update|create|alter|delete|drop|backup|truncate|exec|grant", "xyz", RegexOptions.IgnoreCase);
//把所有的已经经过处理的单引号(转化成@了)在转化回去;
string QueryStr = Regex.Replace(Hiddenfield.Value, @"@+", "@", RegexOptions.IgnoreCase).Replace("@", "'");
//此处处理Get方法的参数
string GetStr = ..........................
string sql = "select * from *** where 1=1 " + QueryStr + GetStr ;
然后就用该sql去查询。
}
因为需要转化,所以在查询的时候,按钮点击时的方法如下:
protected void lblsearch_Click(object sender, EventArgs e)//简单查询
{
string xmmc =txtXMmc3.Value.Trim().Replace("'","");//把单引号去掉
string xmmc1 =txtXMmc1.Value.Trim();
sql = getSqlStr(sql, "Donator",xmmc, "string", "like");
sql = getSqlStr(sql, "",xmmc1 , "numeric", "=");
hidconditoin.Value = sql.Replace("'","@");//把需要的特殊字符单引号先转化成其它非特殊字符:@,
BindDataProject();
}
//sql设置
/*
*** srcSQL:原sql语句
*** FieldName:数据库字段名
*** FeildVal:数据库字段值
*** dataType:字段类型
*** OPtype:操作符 如=, <, <=, like
*/
private string getSqlStr(string srcSQL, string fieldName, string feildVal, string dataType, string OPtype) {//
if (string.IsNullOrEmpty(feildVal.Trim())) {
return srcSQL;
}
else {
feildVal = feildVal.Trim(); //replace(/(^\s*)|(\s*$)/g, "");
switch (dataType) {
case "numeric": //数值型
if (!IsNumeric(feildVal)) {
return srcSQL;
}
return srcSQL + " and " + fieldName + " "+ OPtype + " " + feildVal;
case "string":
return srcSQL + " and " + fieldName + " " + OPtype + " '%" + feildVal + "%'";
case "datetime":
if (!IsDateTime(feildVal))
{
return srcSQL;
} else {
return srcSQL + " and " + fieldName + " " + OPtype + " '" + feildVal + "'";
}
case "stringEqu"://相等的字符串类
return srcSQL + " and " + fieldName + " " + OPtype + " '" + feildVal + "'";
default:
return srcSQL;
}
}
}
public bool IsNumeric(string str)
{
try { decimal.Parse(str); }
catch { return false; }
return true;
}
public bool IsDateTime(string str)
{
try { DateTime.Parse(str); }
catch { return false; }
return true;
}
C# 对于SQL注入的防范
最新推荐文章于 2024-08-08 11:46:49 发布