这里的"花样"是指过滤关键字。 例如过滤字符串 and 可以并一个字符 aandnd 过滤and 后还会变成 and , select * from tb where id=111111111111111111111111111111111 id为int型,这明显超出了int的范围,sqlserver会报错。 而如果sqlserver由于这种错误而引发其它方面的问题(这就是sqlserver的bug或漏洞了).......一般指定了数据类型和过虑掉单引号就ok了。缺少任何一样都是不安全的。sqlText = sqlText += int.Parse(id); 这个是特例,我不相信整个系统都用int类型。
select * from tb where id=111111111111111111111111111111111 这样的语句最多也就是造成了一个异常 注入不了吧
可以写个类,每次传到sql语句拼接的那里都先调用一下这个类,过滤非法字符。
字符串过滤类 public static string InputText(string inputString, int maxLength) { StringBuilder retVal = new StringBuilder();
// check incoming parameters for null or blank string if ((inputString != null) && (inputString != String.Empty)) { inputString = inputString.Trim();
//chop the string incase the client-side max length //fields are bypassed to prevent buffer over-runs if (inputString.Length > maxLength) inputString = inputString.Substring(0, maxLength);
//convert some harmful symbols incase the regular //expression validators are changed for (int i = 0; i < inputString.Length; i++) { switch(inputString[i]) { case '"': retVal.Append("""); break; case '<': retVal.Append("<"); break; case '>': retVal.Append(">"); break; default: retVal.Append(inputString[i]); break; } }
// Replace single quotes with white space retVal.Replace("'", " "); }
return retVal.ToString(); }
借用一下四楼的代码 decimal id;//在这里,我假设id的数据类型是decimal decimal.TryParse(Request["id"] ?? "0", out id);//防止数字型值注入的关键。 string name = Request["name"] ?? "";if(id == 0 || name == ""){ /* 当数据为空时的处理,这段不属于本贴主题 */ }name = name.Replace("'","''");//防止字符型值注入的关键。 string sqlText =string.Format("select * from your_table where id={0} and name='{1}'",id,name); 请所谓的注入高手测试过后再作评价。谢谢。
SqlParameter[] parameters = new SqlParameter[drs.Count+1]; StringBuilder add1 = new StringBuilder("INSERT INTO table1("); StringBuilder add2 = new StringBuilder(); for (int i = 0; i < drs.Count; i++) { string id="field" + drs[i]["id"].ToString(); //...... if (b) { parameters[i] = new SqlParameter("@" + id, value); add1.Append("[" + id + "],"); add2.Append("@" + id + ","); } else { Deny(); return; } } add1.Append("[IP])VALUES("); add1.Append(add2.ToString()); add1.Append("@IP)");
string id = Request.QueryString["id"];
if(!string.IsNullOrEmpty(id)){sqlText = sqlText += int.Parse(id);
// do query }
try{ConvertTo.xxxx()}catch{return false;}return true;
string sqlText = "select * from your_table where id=";
string id = Request.QueryString["id"];
if(!string.IsNullOrEmpty(id)){ sqlText = sqlText += int.Parse(id).ToString(); //刚才这里写的不对,可能会编译不通过吧
// do query }
我只是个人觉得这个拼出的sql就不能注入
如:
"SELECT A, B, C FROM DD WHERE F='" + strFValue + "'";在拼装前对strFValue进行防注入处理,如进行过滤特殊字符。
请教一下,规则很简单:1:数字类型,判断是否为数字2:字符类型,把一个'替换成两个(必要的时候判断长度)以上这么做的目的就是不会把我拼的SQL给“曲解”了不知如何能注入?
用Parameter,是没注入的问题的
string sql = "select * from table1 where id=" + int.Parse(Request["id"]);string型参数拼接:
string sql = "select * from table1 where name='" + Request["name"].Replace("'","''") + "'";========
请问谁可以注入
只要意识到SQL注入的问题或者你会注入,那么问题就简单了。
这里的"花样"是指过滤关键字。
例如过滤字符串 and
可以并一个字符 aandnd 过滤and 后还会变成 and ,
select * from tb where id=111111111111111111111111111111111
id为int型,这明显超出了int的范围,sqlserver会报错。
而如果sqlserver由于这种错误而引发其它方面的问题(这就是sqlserver的bug或漏洞了).......一般指定了数据类型和过虑掉单引号就ok了。缺少任何一样都是不安全的。sqlText = sqlText += int.Parse(id);
这个是特例,我不相信整个系统都用int类型。
注入不了吧
public static string InputText(string inputString, int maxLength)
{
StringBuilder retVal = new StringBuilder();
// check incoming parameters for null or blank string
if ((inputString != null) && (inputString != String.Empty))
{
inputString = inputString.Trim();
//chop the string incase the client-side max length
//fields are bypassed to prevent buffer over-runs
if (inputString.Length > maxLength)
inputString = inputString.Substring(0, maxLength);
//convert some harmful symbols incase the regular
//expression validators are changed
for (int i = 0; i < inputString.Length; i++)
{
switch(inputString[i])
{
case '"':
retVal.Append(""");
break;
case '<':
retVal.Append("<");
break;
case '>':
retVal.Append(">");
break;
default:
retVal.Append(inputString[i]);
break;
}
}
// Replace single quotes with white space
retVal.Replace("'", " ");
}
return retVal.ToString();
}
decimal id;//在这里,我假设id的数据类型是decimal
decimal.TryParse(Request["id"] ?? "0", out id);//防止数字型值注入的关键。
string name = Request["name"] ?? "";if(id == 0 || name == ""){ /* 当数据为空时的处理,这段不属于本贴主题 */ }name = name.Replace("'","''");//防止字符型值注入的关键。
string sqlText =string.Format("select * from your_table where id={0} and name='{1}'",id,name);
请所谓的注入高手测试过后再作评价。谢谢。
SqlParameter[] parameters = new SqlParameter[drs.Count+1];
StringBuilder add1 = new StringBuilder("INSERT INTO table1(");
StringBuilder add2 = new StringBuilder();
for (int i = 0; i < drs.Count; i++)
{
string id="field" + drs[i]["id"].ToString();
//......
if (b)
{
parameters[i] = new SqlParameter("@" + id, value);
add1.Append("[" + id + "],");
add2.Append("@" + id + ",");
}
else
{
Deny();
return;
}
}
add1.Append("[IP])VALUES(");
add1.Append(add2.ToString());
add1.Append("@IP)");
例如下拉列表框中有>,<,=三个选项,变成参数提交到服务端时应检查参数是否真的为>,<,=三者之一
comm.commandtxt=select xx fron tabl10 where id=@id
comm.parameters.add("@id",sqldbtype.decimal);
comm.parameters["@id"].value=xxxx;//xxxx是值
你可以使用SqlParameter 传参数来执行.虽然不是存储过程.但也不是拼的.所以我认为说的对
{
StringBuilder strSql = new StringBuilder(150);
strSql.Append("delete Online ");
strSql.Append(" where UserName=@UserName and SchoolID=@SchoolID"); DbParameter[] parms = new SqlParameter[2];
parms[0] = DbHelper.ParaInstance("@UserName", (DbType)SqlDbType.NVarChar, 20, online.UserName, ParameterDirection.Input);
parms[1] = DbHelper.ParaInstance("@SchoolID", (DbType)SqlDbType.Int, 4, online.SchoolID, ParameterDirection.Input); return DbHelper.ExecuteNonQuery(strSql.ToString(), CommandType.Text, DbHelper.GuanBar_User_ConnString, parms);
}
使用严格过滤的不会/// <summary>
/// 字符过滤编码函数,在实际编程中,建议过滤后还应该使用参数构造sql语句
/// </summary>
/// <param name="value">输入字符串</param>
/// <returns></returns>
public static string StringEnCode(string value)
{
if (value.Trim().Length == 0)
return string.Empty;
value = value.Replace(((char)44).ToString(), ";");//;
value = value.Replace(((char)10).ToString(), "<br>");//br
value = value.Replace(((char)32).ToString(), " ");//空格
value = value.Replace(((char)37).ToString(), "%");//%
value = value.Replace(((char)39).ToString(), "'");//'
value = value.Replace(((char)44).ToString(), ",");//,
value = value.Replace(((char)60).ToString(), "<");//<
value = value.Replace(((char)62).ToString(), ">");//>
value = value.Replace(((char)92).ToString(), "\");//\\
value = value.Replace(((char)94).ToString(), "^");//^
value = value.Replace(((char)45).ToString() + ((char)45).ToString(), "--");//--
value = Regex.Replace(value, "<a href=", "<a target=_blank href=", RegexOptions.Compiled | RegexOptions.IgnoreCase);
Regex regex = new Regex("<a href=", RegexOptions.Compiled | RegexOptions.IgnoreCase);
value = regex.Replace(value, "<a target=_blank href=");
return value;
}