***.net 实现SQL注入过滤

时间:2022.10.22 发布人:**meir

***.net 实现SQL注入过滤

已解决问题

谷歌**meir用户在2022.10.22提交了关于“节奏大师***.net 实现SQL注入过滤”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-26T21:42:04。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢了,下次有事儿别忘了找我 !

希望以下的回答,能够帮助你。

第1个回答

用户名:bypoepoe  

一什么是SQL注入式攻击所谓SQL注入式攻击就圣击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串欺骗服务器执行恶意的问答SQL命令在某些表单中用户输入的内容直接用来须有述宽鲁构造(或者影响)动态SQL命令或作为存储过程的输序它入参数这类表单特别容易受到SQL注入式攻击常见的SQL注入式攻击过程类如⑴某个ASPNETWeb应用有一个登录页面这个登录页面控制陈去印娘着用户是否有权访问应用么念玉息它要求用户输入一个名称和密码⑵影略护该东酸顾队某登录页面中输入的内容将直接用来构造育氢抗动态的SQL命令或者直接用作存储过程的帮且攻乱绍参数下面是ASPNET应用构造查询的一个例子SystemTextStringBuilderquery=newSystemTextStringBuilder(S视东西论山吗ELECT*fromUsersWh**ERElogin=)Append(txtLoginText)Append(ANDpassword=)Append(txtPas议经之年吃解策超序守swordText)Append()⑶攻击者在用户名字和密码输入框中输入或=之类的内容⑷用户输入的内容提交给服务器之后服务器运行上面的ASPNET代码构造出查询用户的SQL命令但由于攻击刑房息者输入的内容非常特殊所以最后得到的SQL命令变成**LECT*fromUsersWh**ERElogin=or=ANDp民映和虽决陆assword=or=⑸服务器执行查询或存储过程将用户输入的**和服务器中保存断然的**进行对比⑹由于SQL命令实际上已被注入式攻击修改已经不能真正验用户身份所以系统会卷相里终航答企进球错误地授权给攻击者如果攻击者知道应用会将表单中输入的内容直接用于验身份的查询他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能欺骗系统授予访问权限系统环境不同攻击者行航顺丰夜析可能造成的损害也不同这主要由苗应用访问**库的安全权限决都优解义攻满曲地定如果用户的帐户具有管理员或其他比较高级声卷电省罗血有防的权限攻击者就可能对**库的表执行各种他想要做的操作包括添加删除或更新**甚至可能直接删除表二如何防范好在要防止ASPNET应用被SQL注入式攻击闯入并不是一件特别困难的事情只要在利用表单输入的内容构造SQL命令之前把所有输入内容过滤一番就可以了过滤输入内容可以按多种方式进行

⑴对于动态构造SQL查询的场合可以使用下面的技术第一替换单引号即把所有单独出现的单引号改成两个单引号防止攻击者修改SQL命令的含义再来看前面的例子**LECT*fromUsersWh**ERElogin=or=ANDpassword=or=显然会得到与**LECT*fromUsersWh**ERElogin=or=ANDpassword=or=不同的结果第二删除用户输入内容中的所有连字符防止攻击者构造出类如**LECT*fromUsersWh**ERElogin=masANDpassword=之类的查询因为这类查询的后半部分已经被注释掉不再有效攻击者只要知道一个合法的用户登录名称根本不需要知道用户的密码就可以顺利获得访问权限第三对于用来执行查询的**库帐户限制其权限用不同的用户帐户执行查询插入更新删除操作由于隔离了不同帐户可执行的操作因而也就防止了原本用于执行**LECT命令的地方却被用于执行IN**RTUPDATE或DELETE命令⑵用存储过程来执行所有的查询SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击此外它还使得**库权限可以限制到只允许特定的存储过程执行所有的用户输入必须遵从被调用的存储过程的安全上下文这样就很难再发生注入式攻击了⑶限制表单或查询字符串输入的长度如果用户的登录名字最多只有个字符那么不要认可表单中输入的个以上的字符这将大大增加攻击者在SQL命令中插入有害代码的难度⑷检查用户输入的合法性确信输入的内容只包含合法的****检查应当在客户端和服务器端都执行之所以要执行服务器端验是为了弥补客户端验机制脆弱的安全性在客户端攻击者完全有可能获得网页的源代码修改验合法性的脚本(或者直接删除脚本)然后将非法内容通过修改后的表单提交给服务器因此要保验操作确实已经执行唯一的办法就是在服务器端也执行验你可以使用许多内建的验对象例如RegularExpressionValidator它们能够自动生成验用的客户端脚本当然你也可以插入服务器端的方法调用如果找不到现成的验对象你可以通过CustomValidator自己创建一个⑸将用户登录名称密码等**加密保存加密用户输入的**然后再将它与**库中保存的**比较这相当于对用户输入的**进行了消处理用户输入的**不再对**库有任何特殊的意义从而也就防止了攻击者注入SQL命令SystemWebSecurityFormsAuthentication类有一个h**ashPasswordForStoringInConfigFile非常适合于对输入**进行消处理⑹检查提取**的查询所返回的记录数量如果程序只要求返回一个记录但实际返回的记录却超过一行那就当作出错处理

以上**参考与赛迪网**但是我觉得在我们的ASPNET程序里防止SQL注入首先应该尽量使用存储过程关于使用存储过程的好处在这里就不展开讨论了使用参数传递变量最不妥当的方法就是认为判断SQL注入信息尽管如此可能日常开发中由于种种原因不能做的面**道存在各种各种的实际问题现在是最近在一个项目中没有考虑SQL注入项目补救写的一个组件库**也参考来源与网络实现很简单下面是具体实现的源程序usingSystem;usingSystemTextRegularExpressions;usingSystemWeb;namespaceFSqlKeyWord…{/**////<summary>///SqlKey的摘要说明///</summary>publicclassSqlKey…{privateh**ttpRequestrequest;privateconststringStrKeyWord=@select|insert|delete|from|count(|droptable|update|truncate|asc(|mid(|char(|xp_cmdshell|execmaster|netlocalgroupadministrators|:|netuser||or|and;privateconststringStrRegex=@[|;||/|(|)|[|]|}|{|%|@|*|!|];publicSqlKey(SystemWebh**ttpRequest_request)…{////TODO:在此处添加构造函数逻辑//thisrequest=_request;}/**////<summary>///只读属性SQL关键字///</summary>publicstaticstringKeyWord…{get…{returnStrKeyWord;}}/**////<summary>///只读属性过滤特殊字符///</summary>publicstaticstringRegexString…{get…{returnStrRegex;}}/**////<summary>///检查URL参数中是否带有SQL注入可能关键字///</summary>///<paramname=_request>当前h**ttpRequest对象</param>///<returns>存在SQL注入关键字true存在false不存在</returns>publicboolCheckRequestQuery()…{if(requestQueryStringCount!=)…{//若URL中参数存在逐个比较参数for(inti=;i<requestQueryStringCount;i++)…{//检查参数值是否合法if(CheckKeyWord(requestQueryString[i]ToString()))…{returntrue;}}}returnfalse;}/**////<summary>///检查提交表单中是否存在SQL注入可能关键字///</summary>///<paramname=_request>当前h**ttpRequest对象</param>///<returns>存在SQL注入关键字true存在false不存在</returns>publicboolCheckRequestForm()…{if(requestFormCount>)…{//获取提交的表单项不为逐个比较参数for(inti=;i<requestFormCount;i++)…{//检查参数值是否合法if(CheckKeyWord(requestForm[i]))…{//存在SQL关键字returntrue;}}}returnfalse;}/**////<summary>///静态方法检查_sword是否包涵SQL关键字///</summary>///<paramname=_sWord>被检查的字符串</param>///<returns>存在SQL关键字返回true不存在返回false</returns>publicstaticboolCheckKeyWord(string_sWord)…{if(RegexIsMatch(_sWordStrKeyWordRegexOptionsIgnoreCase)||RegexIsMatch(_sWordStrRegex))returntrue;returnfalse;}/**////<summary>///反SQL注入返回无注入信息否则返回错误处理///</summary>///<returns>返回无注入信息否则返回错误处理</returns>publicstringCheckMessage()…{stringmsg=;if(CheckRequestQuery())//CheckRequestQuery()||CheckRequestForm()…{msg=<spanstyle=fontsize:px;>非法操作!<br>;msg+=操作IP:+requestServerVariables[REMOTE_ADDR]+<br>;msg+=操作时间+DateTimeNow+<br>;msg+=页面+requestServerVariables[URL]ToLower()+<br>;msg+=<a#onclick=historyback()>返回上一页</a></span>;}returnmsgToString()}}}lishixinzhi/Article/program/net/201311/11680