当前位置:编程学习 > C#/ASP.NET >>

ASP.Net 开发出来的web项目,怎样防止黑客的攻击?

软件做完了,偶尔性的发现系统上存在sql注入的漏洞,请问采用什么办法补救啊,有没有什么好的方法?请大家赐教了。。。。


如:我在一个界面点击查询的时候:
   
   正确的:select * from table1 where strWhere="'+xx+"'" (sql拼接的)xx为 输入框的内容   
   注入后的sql:select * from table1 where strWhere="'+xx+"'"   ,如果客户端输入框中输入:

  ';drop table table1--'

   编译后:select * from table1 where strWhere='';drop table table1--'

   黑客一旦知道表结构,那么这个数据表就ko了(死翘翘),大家有什么好的方法杜绝啊,新手不懂,那些js过滤什么的就别提了,有几百张form,我不可能一个控件一个控件的去判断,有没有什么高招?不知道使用存储过程能不能杜绝?还有就是我的sql是拼接的,危险性极高。。。请有经验者求救啊。。。。。解决后另外再加分。。。 web网站怎样防止黑客攻击 web网站怎样开发才安全  --------------------编程问答-------------------- 既然知道有SQL注入,那还用什么拼接啊。早在1998-2000年的时候,由于网络刚开始发展,因此SQL注入的问题还不明显,这之后被大量爆出后,早淘汰了拼接SQL的方法。所以有时候也很不懂,为什么在这里还是经常能看见有人拼接SQL。
select * from a where b=@b
@b就是一个变量,然后对该变量赋值,就避免了SQL注入,自己看看ADO.NET吧,很简单的玩意儿。 --------------------编程问答-------------------- 用ef或Linq吧。原生防注入 --------------------编程问答--------------------
引用 1 楼 neell 的回复:
既然知道有SQL注入,那还用什么拼接啊。早在1998-2000年的时候,由于网络刚开始发展,因此SQL注入的问题还不明显,这之后被大量爆出后,早淘汰了拼接SQL的方法。所以有时候也很不懂,为什么在这里还是经常能看见有人拼接SQL。
select * from a where b=@b
@b就是一个变量,然后对该变量赋值,就避免了SQL注入,自己看看ADO.NET吧,很简单的玩意儿。


没考虑那么多,对了我还遗漏了一种就是url参数的注入,这个比较的关键,这个采用什么方法才好呀? --------------------编程问答--------------------
引用 2 楼 cuit 的回复:
用ef或Linq吧。原生防注入


ef、Linq没接过手。 --------------------编程问答--------------------
参数化就行。
例如

string str = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                string strSql ="insert into MemberUser_Info(MemberGuid,MemberName,MemberPwd)values(@strGuid,@strName,@strPwd)";
                SqlCommand comm = new SqlCommand(strSql,conn);
                comm.Parameters.Add(new SqlParameter("@strGuid", strGuid));
                comm.Parameters.Add(new SqlParameter("@strName",strName));
                comm.Parameters.Add(new SqlParameter("@strName",strPwd));
                return comm.ExecuteNonQuery();
            }


--------------------编程问答-------------------- 把数据表名和数据库 的名字改的复杂一些,加写数字进去 --------------------编程问答--------------------
引用 5 楼 fengyarongaa 的回复:
参数化就行。
例如


C# code
?



123456789101112

string str = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;             using (SqlConnection conn = new SqlConnect……



如果我要实现多条件查询,该怎样写这个参数化查询啊。。。。
比如: if(a!=""){}if(b!="")
 ..............
  .............
怎样参数化参数 --------------------编程问答-------------------- LZ啊,你还是踏实点,好好学学最简单的教程吧,这些东西随便哪本教程里都有的。5楼的所谓的参数,就是一楼的@b --------------------编程问答-------------------- 参数化。 存储过程。 --------------------编程问答--------------------
引用 5 楼 fengyarongaa 的回复:
参数化就行。
例如
C# code?1234567891011string str = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;            using (SqlConnection conn = new SqlConnection(str))            ……

+1 --------------------编程问答--------------------  @传值法,或者linq 或者orm 都可以  至少sql注入可以防止掉了  --------------------编程问答--------------------  把sql语句操作写成存储过程是可以防止的 --------------------编程问答-------------------- 如果黑客不破服务器,B\S结构除了SQL注入还有别的办法不? --------------------编程问答-------------------- 存储过程。。。 --------------------编程问答-------------------- 个人感觉过滤了'-就无大事了,所谓的参数化存储过程很多是写好后在存储过程里exec(@sql)这样数据化还是没作用了 --------------------编程问答-------------------- 有几百张form,我不可能一个控件一个控件的去判断
看来你的站也不小了。
得了,楼主,你就多管齐下,
参数化必须、过滤必须、另外在服务器安装一些防护软件也能达到阻止注入的作用!

--------------------编程问答--------------------  使用sql过虑,同时赋值时使用参数。 --------------------编程问答-------------------- 参数化,过滤
过滤的时候比如 delete,还要过滤这个关键字被被编码后的格式
有的注入不是单纯的写这些关键字,都被编码了。 --------------------编程问答-------------------- 1、所有文本的地方用下面方法过滤吧。
2、SQL语句重新写,都用传参。
#region 过滤 Sql 语句字符串中的注入脚本
        /// <summary>
        /// 过滤 Sql 语句字符串中的注入脚本
        /// </summary>
        /// <param name="source">传入的字符串</param>
        /// <returns>过滤后的字符串</returns>
        public static string SqlFilter(string source)
        {
            //单引号替换成两个单引号
            source = source.Replace("'", "''");

            //半角封号替换为全角封号,防止多语句执行
            source = source.Replace(";", ";");

            //半角括号替换为全角括号
            source = source.Replace("(", "(");
            source = source.Replace(")", ")");

            ///////////////要用正则表达式替换,防止字母大小写得情况////////////////////

            //去除执行存储过程的命令关键字
            source = source.Replace("Exec", "");
            source = source.Replace("Execute", "");

            //去除系统存储过程或扩展存储过程关键字
            source = source.Replace("xp_", "x p_");
            source = source.Replace("sp_", "s p_");

            //防止16进制注入
            source = source.Replace("0x", "0 x");

            return source;
        }
        #endregion --------------------编程问答-------------------- 改成传参,用OleDbParameter[]或SqlParameter[] --------------------编程问答--------------------
引用 20 楼 keleopp 的回复:
改成传参,用OleDbParameter[]或SqlParameter[]


我想问下,如果客户端的黑客依旧输入“drop table table1”这样的,那么转为参数@q的值,cmd命令是 select.... where q=@q ,q的值不依旧是drop table table1么?为何这样可以防SQL注入呢?原理是啥? --------------------编程问答--------------------
引用 21 楼 vajoy 的回复:
引用 20 楼 keleopp 的回复:改成传参,用OleDbParameter[]或SqlParameter[]

我想问下,如果客户端的黑客依旧输入“drop table table1”这样的,那么转为参数@q的值,cmd命令是 select.... where q=@q ,q的值不依旧是drop table table1么?为何这样可以防SQL注入呢?原理是啥?……


只能告诉楼主 参数化后 在微软的框架中能自动过滤注入信息,原理的话相信楼主也不会深究。 --------------------编程问答-------------------- 过滤个毛 直接静态化不就完了么 完全没这问题了。伪静态,静态 都成 --------------------编程问答-------------------- 参数化 --------------------编程问答-------------------- ef或linq,要不就伪静态。 --------------------编程问答-------------------- 避免拼接字符串,用参数形式。 --------------------编程问答-------------------- 1.sqlparameter
  string sql = "insert into Table_doctor values(@doc_title,@doc_zhiwei,@doc_content,@createtime)";
        SqlParameter[] par = new SqlParameter[] { 
            
            new SqlParameter("@doc_title",doctor_title),
            new SqlParameter("@doc_zhiwei",doctor_zhiwu),
            new SqlParameter("@doc_content",doctor_info),
            new SqlParameter("@createtime",DateTime.Now.ToString())

        };

2.地址栏的值用正则表达式匹配是否为数字等。
3.替换法
  //防注入
    public static string DelSQLStr(string str)
    {
        if (str == null || str == "")
            return "";
        str = str.Replace(";", "");
        str = str.Replace("'", "");
        str = str.Replace("&", "");
        str = str.Replace("%20", "");
        str = str.Replace("--", "");
        str = str.Replace("==", "");
        str = str.Replace("<", "");
        str = str.Replace(">", "");
        str = str.Replace("%", "");
        str = str.Replace("+", "");
        str = str.Replace("-", "");
        str = str.Replace("=", "");
        str = str.Replace(",", "");
        return str;
    }

4.在Global.asax文件中写验证 --------------------编程问答--------------------
参数化sqlparameter 和 触发器
--------------------编程问答-------------------- replace html标签 --------------------编程问答-------------------- 你真的学会了t-sql语法了吗?如果学会了,我考考你:假设要查询姓名为 
     I'm sp1234
这样的人,你怎么写sql语句?


那些自称“要过滤单引号”的人,你们也懂t-sql语法吗?如果懂,你们为什么连查询条件常量中包含的单引号都要“过滤”?我们本来就是要查询那些可以带单引号的字符串常量,而有些弄出可笑的“过滤单引号”来了,也太荒唐了。

--------------------编程问答--------------------
引用 楼主 lxlit 的回复:
如:我在一个界面点击查询的时候:
   
   正确的:select * from table1 where strWhere="'+xx+"'" (sql拼接的)xx为 输入框的内容   
   注入后的sql:select * from……


正确的写法应该是:
var sql="select * from table1 where strWhere='"+ xx.Replace("'","''") +"'";

如果不懂,那么赶紧去翻翻t-sql语法文档,看看关于字符串常量中可能包含单引号时应该如何转义的规定。

现在号称会写sql语句的程序员,不会都是Csdn学出来的吧?应该能够接受这方面得训练吧?!

不用扯什么成事不足败事有余的“过滤字符”的做法,这根本就是错误的。

甚至也不用硬性地去搞什么“参数化查询”。 --------------------编程问答-------------------- 本来不太想回复,因为最近csdn越来越差了。但是针对这么多回复,还没有一个讲解真正的“道理”的回复,让人很揪心。

有人发帖讽刺说:您怎么总是说得好像是“文不对题”啊?

我实际上要提醒大家:一个好的技术论坛很容易被这样的人毁了,成为一帮中专生的Party,而稍微深入的技术交流却被人说成是“文不对题”了。 --------------------编程问答-------------------- 使用存储过程,程序直接调用存储过程不拼串调用。存储过程编写也有要求,不用like采用charindex.如果存储过程编写需要组串,串也采用参数传递。屏蔽异常错误,避免别人根据异常得出你的数据库相关信息。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,