开盘后magic_quote_gpcSQL注入攻击与防范
在magic_quote_gpc =打开,这两个函数的功能(如addslshes)和stripslashes()的实现。在PHP4.0及以上版本,此选项默认是打开的,所以在php4.0以上版本,即使有PHP程序过滤没有参数,系统会自动转换到PHP每一个通过得到后,COOKIE变量,换句话说,输入到攻击代码都将被转换,将带来很大的困难,攻击者。
尽管如此,攻击者仍然有机会进行SQL注入攻击。前提是,当参数是数字的,它是未经Intval()函数,因为在intval()处理,所有数据将被转换成数字。
如前所述,开放magic_quote_gpc =后,就相当于用addslshes功能(),但数字类型不使用单引号,那么它肯定是一个循环的addslshes转变()函数,使用MySQL的字符()函数或者hex(),字符(),我们可以解释参数为整数并返回这些整数的字符串字符的ASCII码。我们必须把0x的号码在使用十六位二进制。
榜样示范:
假设我们知道管理员的用户名为admin,密码是不知道的,magic_quote_gpc已启用。
SQL语句:$ SQL =从users用户名= $名和密码= $ pwd;注意:变量$name不加引号
此时,用户名= admin % 23被输入到地址栏中,合成的SQL语句是:
从users用户名= 'admin 密码=#;
单引号(')的URL地址栏输入将被添加在这个时候反斜杠和SQL语句将失败。
在admin被转换为ASCII后,它是char(97100109105110)
此时输入地址栏中的用户名= char(97100109105110)% 23。
SQL语句转换为:
从users用户名和密码= =字符(97100109105110)#;
当结果是真的时,你可以顺利地进入背景。
数字注入攻击,我们必须使用intval()转换参数的数字在任何数字参数输入到数据库中,这样我们就可以切断数字注入漏洞的产生。
例如,ID = intval美元(美元_get { 'id' });
从id = $ id的文章中选择*;
在地址栏中输入:ID = 1 = 1% 23 5'or
SQL语句会变成:SELECT * FROM文章id是年;
而不是选择*从文章id是'5'or 1 = 1 #;
总结:
对于每个变量,记得添加单引号,例如用户名为$,
它是不是绝对安全的打开magic_quote_gpc。数字注入攻击,这是不足以用addslashes()函数变换。有必要使用intval()强制参数转换为数字。
如何防止SQL注入攻击
方法1:密码比较
思路:首先,通过用户输入的用户名查询数据库,获取数据库中用户名的相应密码,然后比较用户查询的密码和用户提交的密码。
代码uff1a
复制代码代码如下所示:
从用户名为$的用户中选择密码;
RES = mysql_query美元(美元美元的SQL,Conn);
如果(ARR = mysql_fetch_assoc美元($ RES){ / /)如果存在的用户名
如果($ ARR { 'password} = = $ pwd){ / /密码比较
登录成功;
其他{ }
密码输入错误;
}
{ }人
用户名不存在;
}
分析:在这种情况下,代码是强大的,甚至在magic_quote_gpc =关闭的情况下,SQL注入攻击是可以预防的,因为攻击者要成功登录,绕过银行,第一个是输入的用户名存在,这一步可以构造一个SQL语句(1 = 1%或23)但不能直接绕过,通过第二关。因为用户需要输入正确的密码才能通过,很显然这已经拒绝了SQL注入攻击。
方法二:使用PDO的PDO::准备()预处理防止SQL注入攻击
理念:创建一个PDO对象使用PDO预处理防止SQL注入攻击
代码uff1a
复制代码代码如下所示:
$name =美元_get { 'username};
密码= _get美元美元'password'} {;
从用户名为=和密码的用户中选择*;
1。创建一个PDO对象
为PDO =新PDO(MySQL:主机= localhost;端口= 3306;北京注射液
2。设置编码
为PDO -> exec(集names'utf8);
3。预处理SQL语句
美元美元PDOStatement = PDO ->准备($ SQL);
4。填写收到的用户名和密码
$ PDOStatement ->执行(阵列($name,$ pwd));
5。提取结果
RES =美元美元PDOStatement ->取();
如果(空($)){
用户名或密码输入不正确;
其他{ }
登录成功;
}