首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 菜鸟求助高手前辈详细讲解SQL注入的解决办法(众望之极)!
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 16:14:03 楼主
    小弟网站不幸也被注入,学习了很多帖子,无奈对于只会备份恢复的我都太难。在下的asp.net每天均被强奸一次,跳楼的心都有了。所以,再次肯定有心的高手前辈能深入浅出的给我解决办法,同时也想借此为广大受难兄弟姐妹寻求解救大法!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liangCK
    • 等级:
    发表于:2008-05-13 16:15:511楼 得分:0
    SQL code
    sql如 select * from admin where User='"+UserName+"' and Pwd='"+pwd+"' 如果输入 111和111,sql变成 select * from admin where UserName='111‘ and UserPwd='111' 正常 如果输入 select * from admin where User1='' or ''='' and Pwd='' or ''='' 这样语句的条件就是 User=空 或者 空=空 和 Pwd=空 或者 空=空 那么执行的结果就是 select * from admin,存在记录,验证通过。 如果我们对用户名和密码的提交字段进行过滤 不允许其中出现“空格“就可以防止or注入 还有一种情况,假定猜到用户名是admin 在输入密码的时候如果输入11 or 1=1(假设表单字段为 pass),跳转到执行界面时将如下判断if rs(pwd)=pass then 即if rs(pwd)=11 or 1=1 then 登陆,很显然这事成立的,针对这种情况,除了密码里面不能有空格之外,还有一种解决办法,那就是让表单传来的字段变量写在前面if pass=rs(pwd) then,不过最有效的方法可以对密码进行加密,这也是目前用的比较普遍的方法,md5加密也是用的比较多的加密方法,目前还没有破解的方法,因此也是比较安全的防注入防范措施。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 16:17:392楼 得分:0
    验证输入

    1、过滤关键字

    2、过滤以下字符:
    ;            查询分隔符。
    '            字符数据字符串分隔符。
    --          注释分隔符。
    /* ... */    注释分隔符。服务器不对 /* 和 */ 之间的注释进行处理。
    Xp_          用于目录扩展存储过程的名称的开头,如 xp_cmdshell。

    等等
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    发表于:2008-05-13 16:17:393楼 得分:0
    不要拼接sql脚本,所有地方都在客户端用Command参数传入就没有问题了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 16:17:454楼 得分:0
    龟呢,上面好像贴过
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 16:24:295楼 得分:0
    感谢2楼到4楼的关怀,但是你们所提的SQL过滤和SQL拼接可能对于掌握一定专业知识的人来说没有问题。对于初学者真是无从下手了,记得看到之前的帖子里提过“在Global.asax文件下面加入如下代码”,像这样的才是我们可以消化的东西,也是比较好上手实践的。
    所以,还是恳请后来的高手,给予更多详尽的说明,以便菜鸟手把手的学习,万分感谢!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 17:41:366楼 得分:0
    现在我的解决方法是:我改了我的程序,把接收传递参数的地方都加了限制,这样也是防止url攻击的一种方式,以前我的也是总是受到攻击,归根到底都是自己的程序编码不严谨,所以我的建议是看看自己的编码是不是有问题;最好web开发人员先看看注入式攻击的方式,然后看看自己的程序是不是存在,然后是服务器补丁和数据库补丁都要打好。这是我的一点亲身感受。“在Global.asax文件下面加入如下代码”,我也加了,但是经过我自己的测试,还是能够注入是攻击,我的程序是c#的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 10:18:247楼 得分:0
    Com.Parameters.Add(new SqlParameter("@loginName", SqlDbType.NVarChar, 20));
                Com.Parameters["@loginName"].Value = this.Tbxusername.Text.Trim();
                Com.Parameters.Add(new SqlParameter("@pwd", SqlDbType.NVarChar, 20));
                Com.Parameters["@pwd"].Value = this.Tbxpassword.Text.Trim();
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 12:18:528楼 得分:0
    刚刚创建的QQ群..专门讨论这个问题.大家加入一起讨论吧

    群号:61826772
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 09:17:129楼 得分:0
    解决办法在 http://blog.mdcsoft.cn/archives/200805/46.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-15 09:52:0410楼 得分:0
    谢谢楼上各位前辈的关心支持!另外,特别询问9楼billgates130大哥,您给出的网页参考地址上没有mdcsoft-ips的下载,烦请再次指点!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 14:26:5611楼 得分:0
    我的已经解决了,感谢9楼billgates130!希望大家尽快解决。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 14:30:1212楼 得分:0
    引用 5 楼 shusheng2008 的回复:
    感谢2楼到4楼的关怀,但是你们所提的SQL过滤和SQL拼接可能对于掌握一定专业知识的人来说没有问题。对于初学者真是无从下手了,记得看到之前的帖子里提过“在Global.asax文件下面加入如下代码”,像这样的才是我们可以消化的东西,也是比较好上手实践的。
    所以,还是恳请后来的高手,给予更多详尽的说明,以便菜鸟手把手的学习,万分感谢!!!

    防止SQL注入的根本方法还是修改应用程序,如果没有修改应用程序的条件和技能,就不要再问了,问了也是徒劳。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 14:54:0213楼 得分:0
    楼主的是asp.net做的。那就直接在Global.asax.cs文件中加:
    C# code
    protected void Application_BeginRequest(Object sender, EventArgs e) { StartProcessRequest(); } #region SQL注入式攻击代码分析 /// <summary> /// 处理用户提交的请求 /// </summary> private void StartProcessRequest() { try { string getkeys = ""; string sqlErrorPage = "index.aspx";//转向的错误提示页面 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); 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 (getkeys == "__VIEWSTATE") continue; if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys])) { System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage); System.Web.HttpContext.Current.Response.End(); } } } } catch { // 错误处理: 处理用户提交信息! } } /// <summary> /// 分析用户请求是否正常 /// </summary> /// <param name="Str">传入用户提交数据 </param> /// <returns>返回是否含有SQL注入式攻击代码 </returns> private bool ProcessSqlStr(string Str) { bool ReturnValue = true; try { if (Str.Trim() != "") { string SqlStr = "and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare"; string[] anySqlStr = SqlStr.Split("|".ToCharArray()); foreach (string ss in anySqlStr) { if (Str.ToLower().IndexOf(ss) >= 0) { ReturnValue = false; break; } } } } catch { ReturnValue = false; } return ReturnValue; } #endregion
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 11:01:1814楼 得分:0
    特别来感谢9楼的老大 billgates130的mdcsoft-ips软件,解决了我一直郁闷的问题,现在服务器上所有站点都安全了,一周多没任何被攻击.永远支持老大
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 11:18:1315楼 得分:0
    老大能否写个攻击的软件对付那些小黑啊    欺人太深了.把大家害惨了也
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved