mysql 可以使用更安全的pdo_mysql接口来处理
所有的查询参数话绑定
$sql = 'select * from table where id=:id';
$pdo-prepare($sql)-bindValue(':id', $id, PDO::PARAM_INT)-excute();
$pdo-fetch(); 来获取数据 这样可以很有效的避免被注入
防范注入可以用Web应用防火墙(WAF),使用WAF可以防范大多数的注入攻击
(还有其他类型的网络攻击),应付一般的黑客足够了.另外还可以在网站中使用防注入代码库,可以充分过滤用户输入,减少产生注入漏洞的几率.还有就是网站建成后进行充分的Web渗透测试,解决掉注入漏洞才是根本.
过滤一些常见的数据库操作关键字,
select ,insert,update,delete,and,*等或通过系统函数addslashes对内容进行过滤
php配置文件中register_globals=off;设置为关闭状态.(作用将注册全局变量关闭);如接收POST表单的值使用$_POST['user'],假设设置为ON的话$user才接收值
sql语句书写的时候尽量不要省略小引号(tab上面那个)和单引号
提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,使之不易被猜中
对于常的方法加以封装,避免直接暴漏SQL语句
开启PHP安全模式safe_mode=on
打开magic_quotes_gpc来防止SQL注入,默认为关闭,开启后自动把用户提交sql查询语句进行转换把"'"转换成"\'"
控制错误信息输出,关闭错误信息提示,将错误信息写到系统日志
使用MYSQLI或PDO预处理
SQL注入主要是因为使用了字符串拼接,人为恶意注入影响SQL本身执行逻辑的语句.所以可以使用参数绑定,将一些非法的关键字进行转义,这样即使恶意注入,关键字也会通过转义变成其他字符,整个SQL语法都会有问题,根本无法执行,就不会有SQL注入问题.
SQL注入是一种非常常见的数据库攻击手段,同时也是网络世界中最普遍的漏洞之一,简单理解就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程.
解决方案
方案一:
采用预编译技术
使用预编译的SQL语句,SQL语句的语义不会是不会发生改变的.预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只是把值赋给?,然后将?这个变量传给SQL语句.当然还有一些通过预编译绕过某些安全防护的操作,大家感兴趣可以去搜索一下.
方案二:
严格控制数据类型
在java、c等强类型语言中一般是不存在数字型注入的,因为在接受到用户输入id时,代码一般会做一个int id 的数据类型转换,假如我们输入的是字符串的话,那么这种情况下,程序就会报错.但是在PHP、ASP这些没有强调处理数据类型的语言,一般我们看到的接收id的代码都是如下等代码.
方案三:
对特殊的字符进行转义
数字型注入可以通过检查数据类型防止,但是字符型不可以,那么怎么办呢,最好的办法就是对特殊的字符进行转义了.比如在MySQL中我们可以对" '
"进行转义,这样就防止了一些恶意攻击者来闭合语句.当然我们也可以通过一些安全函数来转义特殊字符.如addslashes()等,但是这些函数并非一劳永逸,攻击者还可以通过一些特殊的方式绕过.
以下是OMG我为大家收集整理的文章,希望大家如果觉得本站发布的文章不错,请转发分享给您身边的朋友,您的支持是我们最大的动力.
SQL注入(SQLInjection)漏洞攻击是目前网上最流行最热门的黑客脚本攻击方法之一,那什么是SQL注入漏洞攻击呢?它是指黑客利用一些Web应用程序(如:网站、论坛、留言本、文章发布系统等)中某些存在不安全代码或SQL语句不缜密的页面,精心构造SQL语句,把非法的SQL语句指令转译到系统实际SQL语句中并执行它,以获取用户名、口令等敏感信息,从而达到控制主机服务器的攻击方法.
① SQL注入漏洞攻击原理
① 1 SQL注入漏洞攻击实现原理
SQL(Structured Query Language)是一种用来和数据库交互的语言文本.SQL注入的攻击原理就是攻击者通过Web应用程序利用SQL语句或字符串将非法的数据插入到服务器端数据库中,获取数据库的管理用户权限,然后将数据库管理用户权限提升至操作系统管理用户权限,控制服务器操作系统,获取重要信息及机密文件.
SQL注入漏洞攻击主要是通过借助于HDSI、NBSI和Domain等SQL注入漏洞扫描工具扫描出Web页面中存在的SQL注入漏洞,从而定位SQL注入点,通过执行非法的SQL语句或字符串达到入侵者想要的操作.下面以一段身份验证的.NET代码为例,说明一下SQL 注入攻击的实现方法.
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
从上面的代码中可以看出,程序在与数据库建立连接得到用户数据之后,直接将username的值通过session传给login.aspx,没有进行任何的过滤和处理措施, 直接用来构造SQL 语句, 其危险系数是非常高的, 攻击者只要根据SQL 语句的编写规则就可以绕过身份验证,从而达到入侵的目的.
SQL注入可以说是一种漏洞,也可以说是一种攻击.当程序中的变量处理不当,没有对用户提交的数据类型进行校验,编写不安全的代码,构造非法的SQL语句或字符串,都可能产生这个漏洞.
例如Web系统有一个login页面,这个login页面控制着用户是否有权访问,要求用户输入一个用户名和口令,连接数据库的语句为:
"select * from users where username = 'username' andpassword = 'password'"
服务器执行查询或存储过程,将用户输入的身份信息和数据库users表中真实的身份信息进行核对,由于SQL命令实际上已被修改,存在永远成立的1=1条件,所以呢已经不能真正验证用户身份,所以系统会错误地授权攻击者访问.
SQL注入的方法很多,在以手动方式进行攻击时需要构造各种各样的SQL语句,所以一般攻击者需要丰富的经验和耐心,才能绕过检测和处理,提交语句,从而获得想要的有用信息.这个过程需要花费很多的时间,如果以这种手动方式进行SQL注入漏洞攻击,许多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等网站就会安全很多了,不是漏洞不存在了,而是手动入侵者需要编程基础,但现在攻击者可以利用一些现成的黑客工具来辅助SQL注入漏洞攻击,加快入侵的速度,使SQL注入变得轻而易举.
(1)绕过身份验证
如一个login界面,需要输入用户名和口令,然后Post到另一个页面,进行身份验证,所以呢攻击者只需在用户名和口令的输入框中都输入aa or'1'='1'的内容,那么攻击者就可以通过欺骗的验证方式而直接进入下一个页面,并拥有和正常登录用户一样的全部特权.原因是什么呢? 我们比较一下正常用户登录和攻击者登录时的两种SQL语句:
SQL= " select * from users where username='aa or'1'='1''and password = ' aa or'1'='1''";
可以看到由and连接的两个条件都被一个永远成立的1=1所代替,执行的结果为true,数据库会认为条件恒成立,会返回一个true,让攻击者以合法身份登录进入下一个页面.
如一个查询页面select1.asp? id=1,编程人员原本设计意图是显示id为1的查询信息,而攻击者利用程序中没有对id内容进行检查的机制,插入自己的代码.
从select1.asp中摘录一段关键代码:
SQL= " select *from photo where photoid= 'id'";
可以看到,id没有进行任何的处理,直接构成SQL语句并执行,而攻击者在知道该系统数据库中表名及字段名的情况下,利用SQL语句特性(分号是将两句SQL 语句分开的符号),直接向数据库Tuser表中添加记录:
如果Web主机使用MSSQL数据库管理系统,那么攻击者就可以用到xp_cmdshell这个扩展存储过程,xp_cmdshell是一个非常有用的扩展存储过程,用于执行系统命令,比如dir、net等,攻击者可以根据程序的不同,提交不同的语句:
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
这样就可以向Web主机系统中成功添加了一个管理员帐户.
SQL注入漏洞攻击检测分为入侵前的检测和入侵后的检测.入侵前的检测,可以通过手工方式,也可以使用SQL注入漏洞扫描工具软件.检测的目的是为预防SQL注入漏洞攻击,而对于SQL注入漏洞攻击后的检测,主要是针对审计日志的查看,SQL注入漏洞攻击成功后,会在Web Service和数据库的审计日志中留下"痕迹".
(1)动态SQL检查
动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能.将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的.预编译的SQL或者存储过程可以将用户的输入作为参数而不是命令来执行,这样就限制了入侵者的行动.当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况.在这种情况下,用户输入的SQL命令仍可能得到执行,数据库仍然存在SQL注入漏洞攻击的危险.
如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字.如果可以接受字母,检查是不是存在不可接受的字符,那就需要设置字符串检查功能.确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字.
使用SQL注入漏洞攻击工具软件进行SQL注入漏洞攻击后,都会在数据库中生成一些临时表.通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过SQL注入漏洞攻击.
在Web服务器中如果启用了审计日志功能,则Web Service审计日志会记录访问者的IP地址、访问时间、访问文件等信息,SQL注入漏洞攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),审计日志文件会急剧增加,通过查看审计日志文件的大小以及审计日志文件中的内容,可以判断是否发生过SQL注入漏洞攻击事件;另外还可以通过查看数据库审计日志,查询某个时间段是否有非法的插入、修改、删除操作.
SQL注入漏洞攻击成功后,入侵者往往会添加特权用户(如:administrator、root、sa等)、开放非法的远程服务以及安装木马后门程序等,可以通过查看用户帐户列表、远程服务开启情况、系统最这段时间期产生的一些文件等信息来判断是否发生过入侵.
SQL注入漏洞攻击的防范方法有很多种,现阶段总结起来有以下方法:
(1)数据有效性校验.如果一个输入框只可能包括数字,那么要通过校验确保用户输入的都是数字.如果可以接受字母,那就要检查是不是存在不可接受的字符,最好的方法是增加字符复杂度自动验证功能.确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字.另外限制表单数据输入和查询字符串输入的长度也是一个好方法.如果用户的登录名最多只有10个字符,那么不要认可表单中输入10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度.
如:这样显然会暴露管理员的用户名、口令信息.可以将其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
这样就安全了很多,入侵者也是不会轻易的就获取到用户名、口令信息.
显然会得到与
相同的结果.
(10)用户权限分离.应尽可能的禁止或删除数据库中sa权限用户的访问,对不同的数据库划分不同的用户权限,这样不同的用户只能对授权给自己的数据库执行查询、插入、更新、删除操作,就可以防止不同用户对非授权的数据库进行访问.