大家都是如何防止SQL注入式攻击的?

时间:2022-03-03 14:05:47
做网站的同志都知道,网站的安全是非常重要的。大家都是如何来防止网站被黑的?

为了防止登录口令被SQL注入攻击,我是将输入的textbox中的文本
如果有“'”的全部替换成“¥”来处理的,不知道大家是怎么做的?

大家交流下。

43 个解决方案

#1


坐等高手.

#2


1.不要或尽量少拼接sql
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)

#3


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)



3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗?


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去,

希望能和大家将这个问题讨论彻底!!

#4


危险字符过滤的类(最新完善版) * 山哥的后台类 *

http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx


我看了一下,但是不知道好用吗,

我想做的是在前台作判断,至今还没有找到好的方法。

#5


引用 3 楼 tianyu_lianxin 的回复:
3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗? 


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去, 

希望能和大家将这个问题讨论彻底!!

原SQL:SELECT ID  FROM SmsGuest WHERE (Type = @UserType) AND (UserName = @UserName)    

 

//-----------------------------------------------------------              

   
            using (SqlConnection connection = new SqlConnection(SqlDataSource3.ConnectionString))
            {
                SqlCommand command = new SqlCommand(SqlDataSource3.SelectCommand.ToString (), connection);
                SqlParameterCollection p;

                //增加参数
                command.Parameters.Add("UserName", "string");
                command.Parameters.Add("UserType", "string");

                //此例需要返回记录数,用了一个比较笨的方法,读入reader,再通过循环得到记录数。
                SqlDataReader reader;
                command .Parameters ["UserName"].Value  =(object ) Label1.Text;
                command.Parameters["UserType"].Value = Typelab.Text.Trim();
             //   command.CommandText = "Select * from SmsUserType where ((UserName='111') and (UserType='新员工'))";
                connection.Open();
                
                  int i = 0;
                //将数据导入reader中,并通过循环得到记录数i
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    i++;
                }
                reader.Close();
                connection.Close();
           
           }

#6


引用 3 楼 tianyu_lianxin 的回复:
引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter) 
 


3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗? 


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去, 

希望能和大家将这个问题讨论彻底!!


举个例子
不进行如sql="Select * from tab where name ='"+name+"'" //这种方法 
全都改为传参sql="Select * from tab where name =@name" //这种方法 


http://topic.csdn.net/u/20090122/12/339f6bb8-9a43-4ccc-a4b9-286d90ab760d.html
http://topic.csdn.net/u/20090122/14/43e47ae1-393f-475a-a4cd-d31bc6a91779.html
http://topic.csdn.net/u/20090122/15/20b8435a-ee83-4d65-a8a6-d6637b442601.html

看一下这三个帖子,是一个人发的.着重看一下第2帖.

#7


sql="Select * from tab where name =@name
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?

#8


引用 7 楼 tianyu_lianxin 的回复:
sql="Select * from tab where name =@name 
这样写后,能不能获得传过来的参数? 
如果通过session传过来的参数也能用这种方法写吗? 


可以定义相应的参数就行了
sql语句尽量用存储过程

#9


#10


做到两点,可保你万无一失
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}

#11


另外,如果考虑插入<script>标签的话,可以在显示的时候进行 Server.HtmlEncode(row["title"].ToString())

#12


引用 7 楼 tianyu_lianxin 的回复:
sql="Select * from tab where name =@name 
这样写后,能不能获得传过来的参数? 
如果通过session传过来的参数也能用这种方法写吗? 

和你用什么传过来没关系,你看一下sqlparameter的用法.

#13


学习

#14




 public class ProcessRequest
    {
        public static void StartProcessRequest()
        {
            string sqlErrorPage = "ErrorPage.htm";
            try
            {
                string getkeys = "";
                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 (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
                        {
                            System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
                            System.Web.HttpContext.Current.Response.End();
                        }
                    }
                }
            }
            catch
            {
                System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
                System.Web.HttpContext.Current.Response.End();
            }
        }

        public static bool ProcessSqlStr(string Str)
        {
            bool ReturnValue = true;
            try
            {
                if (Str != "")
                {
                    string SqlStr = ";|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare";
                    string[] anySqlStr = SqlStr.Split('|');
                    foreach (string s in anySqlStr)
                    {
                        if (Str.IndexOf(s) > -1)
                        {
                            ReturnValue = false;
                        }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
    }

#15


1.使用双引号
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
    void Application_BeginRequest(Object sender, EventArgs e)
    {
        StartProcessRequest();

    }

    #region 
    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;
    }
    #endregion 
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx

#16


过滤 参数化

#17


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)



具体的你要查看相关的东东,了解存储过程,sql语句等!

#18


该回复于2009-02-24 20:24:50被版主删除

#19


太帅了,受教,受教。

#20


推荐使用存储过程

#21


引用 17 楼 supper168 的回复:
引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter) 
 


具体的你要查看相关的东东,了解存储过程,sql语句等!


禁止用户输入敏感 字符 sql 尽量使用参数。。

#22


可以在前台把几个重要的符号设上禁用,他在文本里就输入不上',之类的符号。

#23


引用 20 楼 Terry717 的回复:
推荐使用存储过程

   能详细的讲讲吗?

#24


希望大家就自己的观点能将的详细点,详细加分哦。

#25


SqlCommand cmda = new SqlCommand(sqlu, scn);

                                    cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
                             
                                    cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();

                                    cmda.ExecuteNonQuery();

#26


不要或尽量少拼接sql 
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递

#27


最近看到一篇关于网站安全的文章,与大家分享下:

小技巧的大作用:让你的网站远离危险 


小技巧的大作用:让你的网站远离危险2009-02-19  来自:赛迪网     


目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。 
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。 
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。 
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。 
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。 
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。 
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。 
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。 
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。 
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。 
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。  

#28


最近看到一篇关于网站安全的文章,与大家分享下:

小技巧的大作用:让你的网站远离危险 


小技巧的大作用:让你的网站远离危险2009-02-19  来自:赛迪网     


目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。 
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。 
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。 
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。 
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。 
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。 
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。 
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。 
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。 
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。 
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。  

#29


使用存储过程的例子.

存储过程如下:

CREATE PROCEDURE [dbo].[sp_us_CheckUserInfo]
@LoginName varchar(30),
@Password varchar(60)
AS
Select * from us_User LoginName=@LoginName and Password=@Password
GO

代码如下:

        
        // 检查用户名和密码是否正确
        Private DataSet CheckUserInfo(string userName, string pwd)
        {
          
            SqlParameter[] parms = new SqlParameter[] 
                                        { new SqlParameter("@LoginName", SqlDbType.VarChar, 30),
                                          new SqlParameter("@Password", SqlDbType.VarChar, 60)  };
            parms[0].Value = userName;
            parms[1].Value = pwd;

            // 这里使用了SqlHelper类
            return SqlHelper.ExecuteDataset(_connectString, CommandType.StoredProcedure, "sp_us_CheckUserInfo", parms);
        }    

       // ...

       // 登录的时候
       DataSet ds = CheckUserInfo(txtUserName.Text.Trim(), txtPwd.Text.Trim());
       if(ds.Tables[0].Rows.Count > 0)
       {
           // ...
       }
       else
       {
           // ...
       }
  

#30


如果是过滤的话,会把一些有用的字符也过滤掉,很麻烦

#31


不要拼sql.
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入

#32


楼上的兄弟姐妹们,说了这么多,其实就是就通用的sql防注入方法
就是
参数化数据变量

#33


我是这样写的:
 private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";

再这样调用:string.Format(D_tib, uLogin.Name);

#34


支持存储过程!

#35


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)

支持

#36


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)


很好~

#37


不要想的那么难, 看看microsoft的最佳实践。

照着做就好。 

#38


当然用存储过程了,又快又安全哦~

#39


我用存储过程

#40



1指定数据类型
2 过滤单引号

足够了

#41


最好的方法,使用SqlParameter

#42


受教!

#43


这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:yisheng@hotmail.com, 7X24 为您的网站和服务器保驾护航。

#1


坐等高手.

#2


1.不要或尽量少拼接sql
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)

#3


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)



3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗?


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去,

希望能和大家将这个问题讨论彻底!!

#4


危险字符过滤的类(最新完善版) * 山哥的后台类 *

http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx


我看了一下,但是不知道好用吗,

我想做的是在前台作判断,至今还没有找到好的方法。

#5


引用 3 楼 tianyu_lianxin 的回复:
3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗? 


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去, 

希望能和大家将这个问题讨论彻底!!

原SQL:SELECT ID  FROM SmsGuest WHERE (Type = @UserType) AND (UserName = @UserName)    

 

//-----------------------------------------------------------              

   
            using (SqlConnection connection = new SqlConnection(SqlDataSource3.ConnectionString))
            {
                SqlCommand command = new SqlCommand(SqlDataSource3.SelectCommand.ToString (), connection);
                SqlParameterCollection p;

                //增加参数
                command.Parameters.Add("UserName", "string");
                command.Parameters.Add("UserType", "string");

                //此例需要返回记录数,用了一个比较笨的方法,读入reader,再通过循环得到记录数。
                SqlDataReader reader;
                command .Parameters ["UserName"].Value  =(object ) Label1.Text;
                command.Parameters["UserType"].Value = Typelab.Text.Trim();
             //   command.CommandText = "Select * from SmsUserType where ((UserName='111') and (UserType='新员工'))";
                connection.Open();
                
                  int i = 0;
                //将数据导入reader中,并通过循环得到记录数i
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    i++;
                }
                reader.Close();
                connection.Close();
           
           }

#6


引用 3 楼 tianyu_lianxin 的回复:
引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter) 
 


3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗? 


网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去, 

希望能和大家将这个问题讨论彻底!!


举个例子
不进行如sql="Select * from tab where name ='"+name+"'" //这种方法 
全都改为传参sql="Select * from tab where name =@name" //这种方法 


http://topic.csdn.net/u/20090122/12/339f6bb8-9a43-4ccc-a4b9-286d90ab760d.html
http://topic.csdn.net/u/20090122/14/43e47ae1-393f-475a-a4cd-d31bc6a91779.html
http://topic.csdn.net/u/20090122/15/20b8435a-ee83-4d65-a8a6-d6637b442601.html

看一下这三个帖子,是一个人发的.着重看一下第2帖.

#7


sql="Select * from tab where name =@name
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?

#8


引用 7 楼 tianyu_lianxin 的回复:
sql="Select * from tab where name =@name 
这样写后,能不能获得传过来的参数? 
如果通过session传过来的参数也能用这种方法写吗? 


可以定义相应的参数就行了
sql语句尽量用存储过程

#9


#10


做到两点,可保你万无一失
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}

#11


另外,如果考虑插入<script>标签的话,可以在显示的时候进行 Server.HtmlEncode(row["title"].ToString())

#12


引用 7 楼 tianyu_lianxin 的回复:
sql="Select * from tab where name =@name 
这样写后,能不能获得传过来的参数? 
如果通过session传过来的参数也能用这种方法写吗? 

和你用什么传过来没关系,你看一下sqlparameter的用法.

#13


学习

#14




 public class ProcessRequest
    {
        public static void StartProcessRequest()
        {
            string sqlErrorPage = "ErrorPage.htm";
            try
            {
                string getkeys = "";
                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 (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
                        {
                            System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
                            System.Web.HttpContext.Current.Response.End();
                        }
                    }
                }
            }
            catch
            {
                System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
                System.Web.HttpContext.Current.Response.End();
            }
        }

        public static bool ProcessSqlStr(string Str)
        {
            bool ReturnValue = true;
            try
            {
                if (Str != "")
                {
                    string SqlStr = ";|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare";
                    string[] anySqlStr = SqlStr.Split('|');
                    foreach (string s in anySqlStr)
                    {
                        if (Str.IndexOf(s) > -1)
                        {
                            ReturnValue = false;
                        }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
    }

#15


1.使用双引号
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
    void Application_BeginRequest(Object sender, EventArgs e)
    {
        StartProcessRequest();

    }

    #region 
    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;
    }
    #endregion 
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx

#16


过滤 参数化

#17


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)



具体的你要查看相关的东东,了解存储过程,sql语句等!

#18


该回复于2009-02-24 20:24:50被版主删除

#19


太帅了,受教,受教。

#20


推荐使用存储过程

#21


引用 17 楼 supper168 的回复:
引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter) 
 


具体的你要查看相关的东东,了解存储过程,sql语句等!


禁止用户输入敏感 字符 sql 尽量使用参数。。

#22


可以在前台把几个重要的符号设上禁用,他在文本里就输入不上',之类的符号。

#23


引用 20 楼 Terry717 的回复:
推荐使用存储过程

   能详细的讲讲吗?

#24


希望大家就自己的观点能将的详细点,详细加分哦。

#25


SqlCommand cmda = new SqlCommand(sqlu, scn);

                                    cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
                             
                                    cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();

                                    cmda.ExecuteNonQuery();

#26


不要或尽量少拼接sql 
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递

#27


最近看到一篇关于网站安全的文章,与大家分享下:

小技巧的大作用:让你的网站远离危险 


小技巧的大作用:让你的网站远离危险2009-02-19  来自:赛迪网     


目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。 
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。 
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。 
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。 
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。 
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。 
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。 
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。 
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。 
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。 
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。  

#28


最近看到一篇关于网站安全的文章,与大家分享下:

小技巧的大作用:让你的网站远离危险 


小技巧的大作用:让你的网站远离危险2009-02-19  来自:赛迪网     


目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。 
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全: 
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。 
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。 
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。 
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。 
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。 
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。 
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。 
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。 
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。 
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。  

#29


使用存储过程的例子.

存储过程如下:

CREATE PROCEDURE [dbo].[sp_us_CheckUserInfo]
@LoginName varchar(30),
@Password varchar(60)
AS
Select * from us_User LoginName=@LoginName and Password=@Password
GO

代码如下:

        
        // 检查用户名和密码是否正确
        Private DataSet CheckUserInfo(string userName, string pwd)
        {
          
            SqlParameter[] parms = new SqlParameter[] 
                                        { new SqlParameter("@LoginName", SqlDbType.VarChar, 30),
                                          new SqlParameter("@Password", SqlDbType.VarChar, 60)  };
            parms[0].Value = userName;
            parms[1].Value = pwd;

            // 这里使用了SqlHelper类
            return SqlHelper.ExecuteDataset(_connectString, CommandType.StoredProcedure, "sp_us_CheckUserInfo", parms);
        }    

       // ...

       // 登录的时候
       DataSet ds = CheckUserInfo(txtUserName.Text.Trim(), txtPwd.Text.Trim());
       if(ds.Tables[0].Rows.Count > 0)
       {
           // ...
       }
       else
       {
           // ...
       }
  

#30


如果是过滤的话,会把一些有用的字符也过滤掉,很麻烦

#31


不要拼sql.
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入

#32


楼上的兄弟姐妹们,说了这么多,其实就是就通用的sql防注入方法
就是
参数化数据变量

#33


我是这样写的:
 private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";

再这样调用:string.Format(D_tib, uLogin.Name);

#34


支持存储过程!

#35


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)

支持

#36


引用 2 楼 lovehongyun 的回复:
1.不要或尽量少拼接sql 
2.注意对用户输入的数据进行检查 
3.sql参数使用参数化形式(parameter)


很好~

#37


不要想的那么难, 看看microsoft的最佳实践。

照着做就好。 

#38


当然用存储过程了,又快又安全哦~

#39


我用存储过程

#40



1指定数据类型
2 过滤单引号

足够了

#41


最好的方法,使用SqlParameter

#42


受教!

#43


这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:yisheng@hotmail.com, 7X24 为您的网站和服务器保驾护航。