请问大家有.net防SQL注入攻击代码吗?以及该代码应该写在那里;是写在WEB.CONFIG里吗?

解决方案 »

  1.   

    先写个SqlHelper类,在DAL层或者你要写sql语句的时候用SqlParameter传参数就防止SQL注入攻击。
    例如:
    你要根据用户ID查询用户是否存在,返回一个用户对象实例
    public static UserInfo GetUserInfoByUserID(int UserId)
            {
                UserInfo user = new UserInfo();
                string sql = "select * from UserInfo where UserId=@UserId";
                SqlParameter[] para = new SqlParameter[] { 
                    new SqlParameter("@UserId",UserId)
                };
                SqlDataReader reader = DBHelper.GetSqlDataReader(sql, para);
                if (reader.Read())
                {
                    user.UserId = Convert.ToInt32(reader["UserId"]);
                    user.UserName = reader["UserName"].ToString();
                    user.PassWord = reader["PassWord"].ToString();
                    ...
                }
                return user;
            }数据库连接字符串一般写的WEB.CONFIG里,是为了修改其来方便。
    写在<connectionStrings>
    <add name="connectionString" connectionString="你的连接"/>
    </connectionStrings>
    你的name属性要和SqlHerlper里的ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;的ConnectionStrings["connectionString"]对应。
    SqlHelper累如下。
    也可以自己网上找很多的,我这个是贡初学者,没有涉及到访问存储过程的
    public class SqlHelper
        {
            private static string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
            public static SqlConnection GetSqlConnection()
            {
                SqlConnection con = new SqlConnection(connectionString);
                return con;
            }
            public static void Open(SqlConnection con)
            {
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                else if (con.State == ConnectionState.Broken)
                {
                    con.Close();
                    con.Open();
                }
            }
            /// <summary>
            /// 执行无参SQL语句
            /// </summary>
            /// <param name="sql"></param>
            /// <returns></returns>
            public static int ExecuteCommand(string sql)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                int number = cmd.ExecuteNonQuery();
                con.Close();
                return number;
            }
            /// <summary>
            /// 执行带参SQL语句
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static int ExecuteCommand(string sql, params SqlParameter[] paras)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddRange(paras);
                int number = cmd.ExecuteNonQuery();
                con.Close();
                return number;
            }
            /// <summary>
            /// 执行无参SQL语句,并返回执行记录数
            /// </summary>
            /// <param name="sql"></param>
            /// <returns></returns>
            public static object GetScalar(string sql)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                object obj = cmd.ExecuteScalar();
                con.Close();
                return obj;
            }
            /// <summary>
            /// 执行有参SQL语句,并返回执行记录数
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static object GetScalar(string sql, params SqlParameter[] paras)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddRange(paras);
                object obj = cmd.ExecuteScalar();
                con.Close();
                return obj;
            }
            /// <summary>
            /// 执行无参SQL语句,并返回SqlDataReader
            /// </summary>
            /// <param name="sql"></param>
            /// <returns></returns>
            public static SqlDataReader GetSqlDataReader(string sql)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;
            }
            /// <summary>
            /// 执行有参SQL语句,并返回SqlDataReader
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static SqlDataReader GetSqlDataReader(string sql, params SqlParameter[] paras)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddRange(paras);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return reader;
            }
            /// <summary>
            /// 执行无参SQL语句,并返回DataTable
            /// </summary>
            /// <param name="sql"></param>
            /// <returns></returns>
            public static DataTable GetDataTable(string sql)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);
                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                con.Close();
                return dt
    ;
            }
            /// <summary>
            /// 执行有参SQL语句,并返回DataTable
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static DataTable GetDataTable(string sql, params SqlParameter[] paras)
            {
                SqlConnection con = GetSqlConnection();
                DBHelper.Open(con);            DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddRange(paras);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                con.Close();
                con.Dispose();
                return dt;  
            }
        }
      

  2.   

    只要你在程序里别拼接sql了,用参数化,存储过程,被注入几率会大大降低,比你用那些过滤字符串好用的多
      

  3.   

    petshop里面有一个过滤的方法直接复制出来用吧!
      

  4.   

    可以考虑在global里面对用户输入的数据进行分析,转化成安全字符串养成个好习惯,传参数,避免拼接
      

  5.   

    在global里写
     void Application_BeginRequest(Object sender, EventArgs e)
        {
            StartProcessRequest();    }
        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
            {
                // 错误处理: 处理用户提交信息!   
            }
        }
        private bool ProcessSqlStr(string Str)
        {
            bool ReturnValue = true;
            try
            {
                if (Str.Trim() != "")
                {
                    string SqlStr = "exec¦insert¦select¦delete¦master¦update¦truncate¦declare";
                    string[] anySqlStr = SqlStr.Split('¦');
                    foreach (string ss in anySqlStr)
                    {
                       if(!Str.ToLower().Contains("updatepanel"))
                       {
                        if (Str.ToLower().IndexOf(ss) >= 0)
                        {
                            ReturnValue = false;
                            break;
                        }
                       }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
      

  6.   

    代码一般写在Global.asax里,跟15楼的差不多
      

  7.   

    客户端进行操作的部分尽量写在客户端内,数据库操纵的内容尽量写在数据库,程序操纵的部分尽量写在程序,3者互不影响,防止SQL注入最好的办法就是“使用存储过程”速度快安全性高
      

  8.   


    【autocode代码生成器】 全面支持自动生成 java 标准代码! 
    全面支持自动生成 struts1.2 标准代码! 
    全面支持自动生成 ASP.NET 标准代码! 全面支持当今流行的三大主流开发架构 
    同时欢迎大家有空关注我们的QQ空间 http://915842778.qzone.qq.com/ 需要的朋友可以到天空软件园(www.skycn.com) 、华军软件园(www.newhua.com)、CSDN社区( www.csdn.net)下载使用 
    (注:在其网站的软件搜索里输入 “autocode” 即可查询出autocode代码生成器来供大家下载的地址咯) autocode代码生成器各个版本自动生成代码的特点:--== 1 .【 JAVA版 】具体自动生成的内容如下:     ★ VO、POJO对象 
        ★ DAO接口 
        ★ IMPL接口实现类 
        ★ DAO工厂 
        ★ VO、POJO工厂 
        ★ DBC数据库连接管理类,数据库事务处理机制 
        ★ Servlet业务处理及其配置文件 
        ★ JSP调用页面(增、删、改、查),分页功能自动实现  
    2 .【 Struts1.2 版 】具体自动生成的内容如下: 
          ★ VO、POJO对象 
          ★ DAO接口 
          ★ IMPL接口实现类 
          ★ DAO工厂 
          ★ VO、POJO工厂 
          ★ DBC数据库连接管理类,数据库事务处理机制 
          ★ EncodingFilter 处理中文乱码的编码过滤器 
          ★ Action、Form、struts-config.xml web.xml struts的处理核心类及配置文件 
          ★ JSP调用页面(全面支持struts1.2)(增、删、改、查),分页功能自动实现 
            (如果数据库是sqlserver,又需要分页的,请使用sqlserver2005) 
    3 .【 ASP.NET版 】具体自动生成的内容如下: 
        ★ VO、POJO对象 
        ★ DAO接口 
        ★ IMPL接口实现类 
        ★ DAO工厂 
        ★ VO、POJO工厂 
        ★ DBC数据库连接管理类,数据库事务管理机制 
        ★ ASPX调用页面(增、删、改、查)(含.CS文件),分页功能自动实现 
        ★ Web.Config配置文件(VS2005工程需要的文件)  
    4、特色: 
          ☆ 一键生成,简洁使用。 
          ☆ 生成的代码全部开源,没有任何通过插件或链接库来做的操作。 
          ☆ 支持多表的多主键处理。 
          ☆ 支持数据事务的操作。 
          ☆ 生成内容可以依据客户的需要来选择性的生成。 
          ☆ 支持自定义查询接口的生成,用户可以定义查询条件。 
          ☆ 生成的jsp、Servlet、Action、Asp.net 完全处理好了精度字段的精度及显示处理。 
          ☆ 目前支持Oracle、Sqlserver 数据库对象的自动生成代码。