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

网站每天都被sql注入攻击,有什么特效药没?

立竿见影的效果的。。。
IIS方面?程序方面?
改程序有点麻烦,服务器方面有什么可行的方法没 --------------------编程问答-------------------- 改用存储过程或者在输入的值中去掉单引号 --------------------编程问答-------------------- 不改程序没办法立竿见影。 --------------------编程问答-------------------- 开发的时候代码不规范造成的.. --------------------编程问答-------------------- 立竿见影的办法:全站静态化 --------------------编程问答-------------------- 数据库用存储过程! --------------------编程问答-------------------- 改程序是治本的方法

其他都是治标 --------------------编程问答-------------------- 关注!!! --------------------编程问答-------------------- 存储过程或者参数操作数据库··· --------------------编程问答-------------------- 关注 以前我的项目也被攻击过N次 --------------------编程问答-------------------- 改程序 --------------------编程问答-------------------- 現在網上肉雞真多... --------------------编程问答-------------------- 不要直接拼sql改为传参形式或者用存储过程。 --------------------编程问答-------------------- 不要直接拼sql改为传参形式或者用存储过程。 --------------------编程问答-------------------- 网站关掉 --------------------编程问答-------------------- 楼上太狠了! --------------------编程问答-------------------- 在Global.asax文件中加入如下方法即可:

#region SQL注入式攻击代码分析
        /// <summary> 
        /// 处理用户提交的请求 
        /// </summary> 
        private void StartProcessRequest()
        {
            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.Write("<h3>不能包含执行语句</h3>");
                            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]))
                        {
                            jcFAQApp.FAQ_Util.Log.WriteMessage("<font color:red>注入攻击</red>", System.Web.HttpContext.Current.Request.UserHostAddress.ToString());
                            System.Web.HttpContext.Current.Response.Write("<h3>不能包含执行语句</h3>");
                            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 SqlStr = "exec ¦insert ¦select ¦delete ¦update ¦mid ¦master ¦truncate ¦declare";
                    string[] anySqlStr = SqlStr.Split('¦');
                    foreach (string ss in anySqlStr)
                    {
                        if (Str.ToLower().IndexOf(ss) >= 0)
                        {
                            ReturnValue = false;
                            break;
                        }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
        #endregion
--------------------编程问答-------------------- 顶楼上的。。。。。不错 --------------------编程问答--------------------
引用 16 楼 andrewsway 的回复:
在Global.asax文件中加入如下方法即可:

#region SQL注入式攻击代码分析
        /// <summary>
        /// 处理用户提交的请求
        /// </summary>
        private void StartProcessRequest()
        {
            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.Write(" <h3>不能包含执行语句 </h3>");
                            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]))
                        {
                            jcFAQApp.FAQ_Util.Log.WriteMessage(" <font color:red>注入攻击 </red>", System.Web.HttpContext.Current.Request.UserHostAddress.ToString());
                            System.Web.HttpContext.Current.Response.Write(" <h3>不能包含执行语句 </h3>");
                            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 SqlStr = "exec ¦insert ¦select ¦delete ¦update ¦mid ¦master ¦truncate ¦declare";
                    string[] anySqlStr = SqlStr.Split('¦');
                    foreach (string ss in anySqlStr)
                    {
                        if (Str.ToLower().IndexOf(ss) >= 0)
                        {
                            ReturnValue = false;
                            break;
                        }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
        #endregion

杨永强个人站点:http://www.developceo.cn/ --------------------编程问答-------------------- 1. 屏蔽某些sql关键字
2. 给sql运行账户最小的权限,千万不要sysadmin. --------------------编程问答-------------------- 强密码

参数化SQL --------------------编程问答--------------------
引用 2 楼 baby97 的回复:
不改程序没办法立竿见影。

大实话。
你的问题就在程序代码上。
sql语句是第一考虑因素 --------------------编程问答-------------------- 禁止使用系统存储过程,过滤数据库操作关键字,

或者操作sql都写到数据库中用存储过程 --------------------编程问答-------------------- 参数化、 --------------------编程问答-------------------- 采用传参数的办法调用sql
或者过滤所有的‘’单引号,分号这些敏感字符 --------------------编程问答-------------------- 如果CSDN也用过滤法,那么大家怎么发这个贴??

修改程序才是最终解决方法。 --------------------编程问答--------------------


    /// <summary>
    /// 自己封装的Request 可以在其中进行一些操作
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string BbnRequest(string str)
    {
        if (System.Web.HttpContext.Current.Request.HttpMethod == "GET")
        {
            string value = System.Web.HttpContext.Current.Request[str];

            if (value == null)
            {
                return null;
            }

            string pattern = @"'|xp_cmdshell|/add|exec|%|select|count|insert|delete|drop|update|truncate|or|and|\*|@|master|char|declare|join";
            bool bl = Regex.IsMatch(value, pattern, RegexOptions.IgnoreCase);
            if (bl)
            {
                string clientIp = WbfTools.BLL.Utils.GetIP();
                string clientURL = System.Web.HttpContext.Current.Request.Url.ToString();
                string serverParch = System.Web.HttpContext.Current.Server.MapPath("~/");
                //写日志
                StreamWriter sw = File.AppendText(serverParch + "\\sqlin.txt");
                sw.WriteLine("IP:" + clientIp + "   URL:" + clientURL + "   DateTime:" + DateTime.Now.ToString());
                sw.Flush();
                sw.Close();
                sw.Dispose();

                System.Web.HttpContext.Current.Response.Write("希望您只是来做俯卧撑的!!!<br />");
                System.Web.HttpContext.Current.Response.Write(clientIp);
                System.Web.HttpContext.Current.Response.End();
                return "";
            }
            else
            {
                return value;
            }
        }
        else
        {
            string value = System.Web.HttpContext.Current.Request[str];
            value = Regex.Replace(value, "<", ">", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, ">", "<", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "xp_cmdshell", "<span>xp_cmdshell</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "/add", "<span>/add</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "%", "<span>%</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "select", "<span>select</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "count", "<span>count</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "'", "\"", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "insert", "<span>insert</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "delete", "<span>delete</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "drop", "<span>drop</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "update", "<span>update</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "truncate", "<span>truncate</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "iframe", "<span>iframe</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "or", "<span>or</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "and", "<span>and</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "@", "<span>@</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "chr", "<span>chr</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "mid", "<span>mid</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "master", "<span>master</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "truncate", "<span>truncate</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "char", "<span>char</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "declare", "<span>declare</span>", RegexOptions.IgnoreCase);
            value = Regex.Replace(value, "join", "<span>join</span>", RegexOptions.IgnoreCase);
            return value;
        }
    }
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 以前为商业类网站做维护的时候客户经常投诉这类问题,首先到数据库中看一下注入数据是否有规律可循,有的话还好说可能是用软件操作的,但是没有的话那就惨了,现在有很多专业手动注入网站的,如果是手动注入基本上无解 --------------------编程问答-------------------- 两种办法,一种是在glob中加判断,上面已经有人接了,、
另外一种办法就是把访问数据的帐号的权限变小,
把对应数据库中的系统表syscolumns和sysobjects中的权限中的public的select权限去掉,因为大部份的注入都是从系统表中找出你这个数据库中的大字段,然后再批量替换。所以不能他查系统表的权限就可以较少很多风险。除非他清除你系统中的表结构。 --------------------编程问答-------------------- 先要是否为sql注入 --------------------编程问答-------------------- 不改程序的话,那就别挂在外网上 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 可以改用参数化查询,不用作任何替换,非常有效 --------------------编程问答-------------------- 已经改成参数形式了
string sql = "select * from InfoContent where id=@id";

原先是
string sql = "select * from InfoContent where id="+id;
是不是这样就行了? --------------------编程问答-------------------- 是的 --------------------编程问答-------------------- 如果是。net或java在拼接sql的时候不要直接拼接
用提交参数的方法替换字符串(本身这些语言都提供安全的函数来提交参数)
这个方法从根本上解决sql注入 --------------------编程问答--------------------
引用 2 楼 baby97 的回复:
不改程序没办法立竿见影。


我有。。。。。。把sql服务器去了。。。。wahahhaha.....马上"立竿见影" --------------------编程问答--------------------
引用楼主 aiolia911 的回复:
立竿见影的效果的。。。
IIS方面?程序方面?
改程序有点麻烦,服务器方面有什么可行的方法没

每天都被SQL攻击,说明你的程序写的很烂.
怕麻烦就别写程序.要写好的程序就不能怕麻烦.
你想一辈子写垃圾程序你就别改程序吧. --------------------编程问答-------------------- 用参数化 比较容易改 改是要改的 --------------------编程问答--------------------
引用 8 楼 mqc507 的回复:
存储过程或者参数操作数据库···

同意

你在开发程序的时候 传值最好都用上变量
然后在去给变量赋值 --------------------编程问答-------------------- 我用了16楼的怎么还不管用啊?还是会被注入~一转身的功夫就。。。还有别的办法没啊? --------------------编程问答-------------------- mark 16楼 顶 --------------------编程问答-------------------- 还是改程序比较彻底 --------------------编程问答-------------------- 我大部分都是用存储过程实现的,只是有些语句,偷懒,就懒得用了,还赶时间,所以被人搞了。。。

--------------------编程问答-------------------- 存储过程或者参数化吧。其实改动也不会很大。 --------------------编程问答-------------------- 学习下 --------------------编程问答-------------------- Server.EncodeHtml("查询出来的内容"); --------------------编程问答--------------------
引用 44 楼 aiolia911 的回复:
我大部分都是用存储过程实现的,只是有些语句,偷懒,就懒得用了,还赶时间,所以被人搞了。。。

肚子大否? --------------------编程问答-------------------- 只有修改代码才最关键了!! --------------------编程问答--------------------
引用 48 楼 ccll001 的回复:
引用 44 楼 aiolia911 的回复:
我大部分都是用存储过程实现的,只是有些语句,偷懒,就懒得用了,还赶时间,所以被人搞了。。。



肚子大否?



你太不纯洁了哈哈 --------------------编程问答--------------------
引用 8 楼 mqc507 的回复:
存储过程或者参数操作数据库···

支持这做法 --------------------编程问答-------------------- 写SQL语句时别用字符串连接,用参数的形式 ,最好写成存储过程 --------------------编程问答-------------------- 修改代码

宁静 致远 志在千里 --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 关注,学习 --------------------编程问答-------------------- 绝对立竿见影的办法:
在sql库里写一个任务,每3分钟执行一次对被攻击表在Update替换危险字符在任务,这样最符合楼主在意思,很简单,劳动量很小! --------------------编程问答-------------------- . --------------------编程问答-------------------- mark 16楼 --------------------编程问答-------------------- 对界面控件过滤一下;传的参数可以加密,接受参数后解密再用,这样不加密的代码是无效的,我最初也被攻击过,就这么改了,再没被攻击过。因为那些脚本代码无非是从控件和参数两方面注入的。 --------------------编程问答--------------------
引用 49 楼 teng_s2000 的回复:
只有修改代码才最关键了!!


不知所云,哈哈 --------------------编程问答-------------------- 1. 用 SetParameter
2. 用NHibernate
3. 用Linq (先进的东东, 貌似很花骚)
4. 让攻击来得猛烈些吧.... --------------------编程问答-------------------- 加密参数
--------------------编程问答-------------------- 不用管网站,关机就行! --------------------编程问答-------------------- 代码编写的不规范造成地  --------------------编程问答--------------------
引用 4 楼 ywjq 的回复:
立竿见影的办法:全站静态化



哈哈哈 这哥们笑死我了 确实是立竿见影的方法·· --------------------编程问答-------------------- 在GLOBAL加过滤不可取
1.我可以将SQL语句转为ASCII码绕过你的检查
2.为什么我的QUERYSTRING或者FORM中不能包含SELECT?如果按照此方法,那么我这次回复就会失败,因为我的回复中也包含SELECT。

LS还有全站静态化处理,这个。。。也不可能防止注入吧?

LZ你既然每天都是SQL被注入了,应该是从源头来解决问题,绝对不应该使用其他方法将你的漏洞给包起来。
所以,改查询,改代码才是王道。
--------------------编程问答-------------------- up --------------------编程问答-------------------- 如果你是用的mysql,教你个我正在用的方法。

建一个网站专用的用户,只对某些表有增删改查权限。自己操作用root。
可以防止黑客修改表、删数据。
不过不能防止暴库 --------------------编程问答-------------------- 把单引号replace为两个单引号 --------------------编程问答-------------------- 界面控件的值过滤;参数加密; --------------------编程问答-------------------- 改用参数提交(不是直接拼语句)或用存储过程貌似也可以 --------------------编程问答-------------------- 大哥,你是做软件开发的吗,我怀疑不是 --------------------编程问答-------------------- DING ... --------------------编程问答-------------------- Url传参的时候进行加密
用存储过程
提交表单的时候过滤表单内容和必要时做转义。

比如预防跨站攻击,在处理留言的时候将'<' '>'这些符号进行转移 --------------------编程问答-------------------- 用户输入的时候严格验证
--------------------编程问答-------------------- 我有一个网站,纯ASP+MSSQL的,以前没防的时候,每天不知道有多少访问是过来攻击的。
后来我用了正则表达式,在每个页面前面执行下面这个函数。(很简单的办法吧?)
终于,世界安静了...

正则表达式啊,那是相当的牛,谁用谁知道!

顺便说一句,网站的数据库我已经做好备份了,不信邪的尽管来攻。
让攻击来的更猛烈些吧,哇哈哈哈...

应用网站:http://www.stonerain.net/ ,攻累了别忘记点下广告...
ASP防SQL攻击代码:
call checkSqlInj(false)

sub checkSqlInj(isShow)
Dim IP,thisUrl,aLog

thisUrl=Request.ServerVariables("SCRIPT_NAME")

' IP=getUserIP()
' If checkAttackIP(IP) Then '如果是攻击IP,直接返回
' show "AttackIP!"
' Exit Sub

' Response.Status = "404 Object Not Found"
' Response.End
' Exit Sub
' End if

Dim arrChar(62),totalChar

arrChar(0)=" |%20|%u0020"
arrChar(8)="\(|%28|%u0028"
arrChar(33)="a|%41|%61|%u0041|%u0061"
arrChar(34)="b|%42|%62|%u0042|%u0062"
arrChar(35)="c|%43|%63|%u0043|%u0063"
arrChar(36)="d|%44|%64|%u0044|%u0064"
arrChar(37)="e|%45|%65|%u0045|%u0065"
arrChar(38)="f|%46|%66|%u0046|%u0066"
arrChar(39)="g|%47|%67|%u0047|%u0067"
arrChar(40)="h|%48|%68|%u0048|%u0068"
arrChar(41)="i|%49|%69|%u0049|%u0069"
arrChar(42)="j|%4a|%6a|%u004a|%u006a"
arrChar(43)="k|%4b|%6b|%u004b|%u006b"
arrChar(44)="l|%4c|%6c|%u004c|%u006c"
arrChar(45)="m|%4d|%6d|%u004d|%u006d"
arrChar(46)="n|%4e|%6e|%u004e|%u006e"
arrChar(47)="o|%4f|%6f|%u004f|%u006f"
arrChar(48)="p|%50|%70|%u0050|%u0070"
arrChar(49)="q|%51|%71|%u0051|%u0071"
arrChar(50)="r|%52|%72|%u0052|%u0072"
arrChar(51)="s|%53|%73|%u0053|%u0073"
arrChar(52)="t|%54|%74|%u0054|%u0074"
arrChar(53)="u|%55|%75|%u0055|%u0075"
arrChar(54)="v|%56|%76|%u0056|%u0076"
arrChar(55)="w|%57|%77|%u0057|%u0077"
arrChar(56)="x|%58|%78|%u0058|%u0078"
arrChar(57)="y|%59|%79|%u0059|%u0079"
arrChar(58)="z|%5a|%7a|%u005a|%u007a"
arrChar(59)="\[|%5b|%u005b"
arrChar(61)="]|%5d|%u005d"

totalChar=UBound(arrChar)+1

Dim arrInj
arrInj=" and"_
&",varchar("_
&",cast("_
&",char("_
&",count("_
&",declare "_
&",delete"_
&",exec("_
&",insert"_
&",mid"_
&",[master]"_
&",select "_
&",truncate"_
&",update"
arrInj=Split(arrInj,",")

Dim i,j,strPattern,intAsc,strPattern2
strPattern=""
For i=0 To UBound(arrInj)
If strPattern<>"" Then strPattern=strPattern&"|"
For j=1 To Len(arrInj(i))
intAsc=Asc(UCase(Mid(arrInj(i),j)))-32
If intAsc>=0 And intAsc<totalChar Then
If TypeName(arrChar(intAsc))="String" Then
strPattern=strPattern&"(?:"&arrChar(intAsc)&")"
End if
End if
Next
Next

strPattern2=Replace(strPattern,"(?:","(")

Dim re,Matches,Match
Set re=new RegExp
re.IgnoreCase =true
re.Global=True
re.Pattern=strPattern

If Request.Form<>"" Then
if re.Test(Request.Form) Then
' show "AttackIP!"
' Exit Sub

aLog="URL:["&thisUrl&"]"
aLog=aLog&" Attack From:Form,"
aLog=aLog&"start-->"&vbCrLf
aLog=aLog&Request.Form&vbCrLf
aLog=aLog&"<--Attack end---"&vbCrLf
' Call addAttackIP(IP,aLog)

If isShow then
re.Pattern=strPattern2
Set Matches = re.Execute(Request.Form)
For Each Match in Matches
Response.Write Match.Value&","
Next
Response.End
Else
Response.Status = "404 Object Not Found"
Response.End
End if
End if
End If

If Request.QueryString<>"" Then
if re.Test(Request.QueryString) Then
' show "AttackIP!"
' Exit Sub

aLog="URL:["&thisUrl&"]"
aLog=aLog&" Attack From:QueryString,"
aLog=aLog&"start-->"&vbCrLf
aLog=aLog&Request.QueryString&vbCrLf
aLog=aLog&"<--Attack end---"&vbCrLf
' Call addAttackIP(IP,aLog)

If isShow then
re.Pattern=strPattern2
Set Matches = re.Execute(Request.QueryString)
For Each Match in Matches
Response.Write Match.Value&","
Next
Response.End
Else
Response.Status = "404 Object Not Found"
Response.End
End if
End if
End If

Set re=nothing
end Sub --------------------编程问答-------------------- 顺便说一下,上面有朋友说可以“将SQL语句转为ASCII码绕过你的检查”。
我这段代码是可以防止ASCII转码的,连UTF8转码都可以防。

至于说“为什么我的QUERYSTRING或者FORM中不能包含SELECT?”这个确实就顾及不到了,毕竟严谨的程序那才是王道。

但话说回来,不是编程或者英文性质的网站,一般还真的很少出现这种英文单词。对于一般的应用,已经足够了。 --------------------编程问答-------------------- 改程序,这个是程序员的问题,程序不规范,有些bug就会这样.... --------------------编程问答-------------------- 写httpmodule --------------------编程问答-------------------- 假如服务器是你自己的,那么就很好处理这个问题,在SQL用户权限方面限制一下就可以基本防止注入了,就是说一般的浏览用户权限只有很小的只读而已,至于后台用户就用另一个权限稍大的SQL用户,然后修补好后台程序,或者把“查找”,“插入”,“修改”,“删除”这四个基本操作全部封装在存储过程里面(我就是这样做),然后通过参数传递调用即可。 --------------------编程问答-------------------- 最简单的办法是修改IIS配置,
将500错误指向自定义的错误报告页面.

这样客户端无法得到详细的错误报告信息,
就可以防止sql注入了 --------------------编程问答--------------------
引用 14 楼 hdngo 的回复:
网站关掉
强。 --------------------编程问答-------------------- 过滤SQL语句 --------------------编程问答-------------------- 使用存储过程啊,这是比较好的方法
--------------------编程问答-------------------- 不要直接拼sql改为传参形式或者用存储过程

12楼说的很对 --------------------编程问答-------------------- 拜托,直接过滤字符串就好了啊!
--------------------编程问答-------------------- 项目改动应该不是很大的啦
--------------------编程问答-------------------- 学习中...0.0 --------------------编程问答-------------------- 在 全局文件里 Request 提交事件里做筛选! 有 select update  ‘’等关键字、拒绝提交。
不过这种方法会影响网站提交速度,只能做应急用。 --------------------编程问答-------------------- IIS防火墙,绝对立竿见影。GET|POST|Cookie|Session全部给你过滤掉注入行为。而重要,不用修改以前的程序。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 你应该看一下数据库的表,看是不是有JS木马 --------------------编程问答-------------------- 存储过程是王道!
LZ多学学这方面的!我也正在学呢 --------------------编程问答--------------------
引用 26 楼 wbflike 的回复:
C# code///<summary>/// 自己封装的Request 可以在其中进行一些操作///</summary>///<param name="str"></param>///<returns></returns>publicstaticstring BbnRequest(string str)
    {if (System.Web.HttpContext.Current.Request¡­
--------------------编程问答-------------------- 呵呵。参数化!加过滤吧 --------------------编程问答-------------------- 前台和后台
用二个数据库用户
后台的给可写入的权限
前台只能可读 --------------------编程问答-------------------- 还是要改代码了,这才是治本的方法,用参数来实现所有的查询。 --------------------编程问答-------------------- 饿???

关掉 终极解决办法 哈哈 --------------------编程问答-------------------- 我以前也有这样一来的困惑,后来发现了,其实防止SQL很简单.
要么参数化SQL和存储过程,要么把字符串的单引号替换成2个单引号.

而16楼说的,在global.asax里面加那种过滤特殊字符串的方法,不合理,也不安全.以前我也以为这种方法很棒,其实不然,只要把注入的sql转成16进制的,那么这种方法还是防不住的.不信去下个16进制的转换器试试.

希望大家不要盲从这些东西,很多时候只有自己亲自试过才知道,就好象网上通用存储过程就可以注入,只要处理一下,就能用了.所以我觉得大家还是亲自试试,比较好,不要盲从. --------------------编程问答-------------------- goodjop
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,