当前位置: 代码迷 >> SQL >> 关于sql 流入,你了解多少
  详细解决方案

关于sql 流入,你了解多少

热度:71   发布时间:2016-05-05 10:56:45.0
关于sql 注入,你了解多少?

             相信在验收机房或者学生收费系统的时候,很多人的师傅都在开始登陆界面上首先莫名其妙的写了一串东西。。然后莫名奇妙的他们就登陆进去了。。没有告诉他们用户名,没有告诉他们任何密码。。这是怎么回事?师傅在输入的时候我还像个傻子一样在一边嚷嚷:诶,不对不对,你输得都不对。。对我当时的表现,我感觉都。。真的是。。。不忍回忆。。。还好,用师傅的那些东西没有能登进去。我暗自窃喜,感觉自己的好强大。。但是没有明白他说的那些意思。。。后来在验收软工文档的时候,师傅又提到了这件事。。大概给我讲了一下,我才明白,原来,这叫做“SQL注入”。听着就挺高大上的。。但是,有关SQL注入,你又了解多少呢。。。

        【概念】所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击

        【原理】就拿我们机房的例子来说吧。在登陆界面上我们让用户输入登录名和密码,对了,才有权限进入我们的系统。。所以我们的界面是这个样子的。。


             所以,我们在编写代码的时候就会这样写txtsql = "select * from user_info where userID='" & txtName.Text & "' and  Val(mrc.Fields(1)) ="' &  Val(txtPassword.Text) & '"   很明显,如果有登陆权限的人输入正确的登录名和正确的密码之后,系统便能够从数据库中找到相应的数据,并允许登陆系统,相反,如果输入的用户名或者密码其中有一个错了,那就不能登陆,理论上是这样没错,但是,对于SQL注入有漏洞的网站就危险了。。只要那些黑客设计一下特殊的字符串,那便很有可能被黑客入侵,获得相应的用户信息。。这是一件多么可怕的事情。。但是,那些黑客又是怎样设计特殊字符的呢。。还用这个例子来说,,比如我在用户名上输入:' or 1=1 #     后边的密码随便输入,便可以进入这个系统。。我们来分析一下。。

      当我们输入:' or 1=1 #    的时候,我们在后台编写的代码就变成了select  * from user_info where userID ='' or 1=1 # and val(mrc.fields(1))='" & val(txtpassword.text) & '" 

请大家注意了or后边的1=1是永远成立的,也就是说,用户名这肯定没有问题能够破解。但是有人问了,还有密码的限制呢。。请注意,#是SQL中的注释符,也就是说,#后边的内容都被注释掉了,,并不能被执行,,所以,这句代码可以简化为 select  * from user_info where userID ='' or 1=1 ,然而,1=1是永远成立的,也就是说,where子句 永远成立。。所以,这句代码可以简化为select  * from user_info。。。也就是搜索user_info 中的所有内容。所以,黑客就能简简单单的进入我们的系统了。。

   【防止SQL注入】

       (1)  对客户端提交的变量参数进行仔细地检测。对数值型的参数,一般用 isNumeric()函数来判断一下其是否包含非数字字符;对字 符 型 参 数 , 需 要 对 单 引 号 、 双 引 号 、“――”、分号等等进行过滤,最好还要对用户提交参数的长度进行判断,凡属非法者由程序给出错误提示。发现客户端提交的参数中有"exec、insert、select、delete、from、update、count、and、*、%、user、xp_cmdshell、 add、net、chr、mid、master、truncate、char、declare、Asc"等用于 SQL 注入的常用字符时,立即停止执行 ASP 并给出警告信息或转向出错页面。在服务端正式处理之前对提交数据的合法性进行检查,这是比较好的解决方法。在没有确认客户端的输入是否合法之前,服务器拒绝进行关键性的操作和处理。一旦检测到敏感字符或字符串,针对数据库的操作立即中止。
     (2)   摒弃动态 SQL 语句,而改用用户存储过程来访问和操作数据库。这需要在建立数据库后,仔细考虑 Web
程序需要对数据库进行的各种操作,并为之建立存储过程,然后让 Web 程序调用存储过程来完成数据库操作。这样,用户提交的数据将不是用来生成动态 SQL 语句,而是确
确实实地作为参数传递给存储过程,从而有效阻断了 SQL注入的途径。

        【总结】   害人之心不可有,防人之心不可无。。。










  相关解决方案