防止SQL注入

一、SQL注入简介

SQL注入是比较常见的网络攻击方式之一,它不是利用**操作系统**的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改**数据库**。

二、SQL注入攻击的总体思路

  1. 寻找到SQL注入的位置

  2. 判断服务器类型和后台数据库类型

  3. 针对不通的服务器和数据库特点进行SQL注入攻击

三、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=

’ “+userName+” ’ and password=’ “+password+” '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=

‘’or 1 = 1 – and password=’’

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE

username=’’ ;DROP DATABASE (DB Name) --’ and password=’’

其后果可想而知…

四、防止sql注入的方法

1. mysql_real_escape_string – 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集

使用方法如下:

$sql = "select count(*) as ctr from users where username

=’".mysql_real_escape_string($username)."’ and

password=’". mysql_real_escape_string($pw)."’ limit 1";

使用

mysql_real_escape_string()

作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。

2. 打开magic_quotes_gpc来防止SQL注入

php.ini中有一个设置:magic_quotes_gpc = Off
这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,
比如把 ’ 转为 \等,对于防止sql注射有重大作用。

如果magic_quotes_gpc=Off,则使用addslashes()函数

addslashes() 函数返回在预定义的字符前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

PHP MYSQL注入攻击需要预防7个要点

  1. 数字型参数使用类似intvalfloatval这样的方法强制过滤。

intval
变量转成整数类型。
语法: int intval(mixed var, int [base]);
返回值: 整数
函数种类: PHP 系统功能、内容说明
本函数可将变量转成整数类型。可省略的参数 base 是转换的基底,默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。

floatval
(PHP 4 >= 4.2.0, PHP 5)
floatval — 获取变量的浮点值
描述
float floatval ( mixed $var )
返回变量 var 的 float 数值。
var 可以是任何标量类型。你不能将 floatval() 用于数组或对象。
<?php
$var = ‘122.34343The’;
f l o a t v a l u e o f v a r = f l o a t v a l ( float_value_of_var = floatval ( floatvalueofvar=floatval(var);
print $float_value_of_var; // 打印出 122.34343
?>

  1. 字符串型参数使用类似mysql_real_escape_string这样的方法强制过滤,而不是简单的addslashes。

  2. 最好抛弃mysql_query这样的拼接SQL查询方式,尽可能使用PDO的prepare绑定方式。

  3. 使用rewrite技术隐藏真实脚本及参数的信息,通过rewrite正则也能过滤可疑的参数。

Rewrite主要的功能
Rewrite主要的功能就是实现URL的重写。它的正则表达式是基于Perl语言,入站的规则用于修改 HTTP 请求 Url。这些规则可以为以下几个目的,如演示对用户更加友好的 URL 命名空间为您的 Web 站点,将请求的 Url 重定向到新位置,或阻止访问 Url 来提供服务。出站的重写规则修改 HTTP 响应。例如,如果您的 Web 站点的导航结构已更改,您可以创建修改您的内容中的 url,以便将 Web 页的内容指向正确的位置出站规则。然后,您可以创建基于缓存的位置与新的 url 的客户端请求重定向的入站的规则。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

  1. 关闭错误提示,不给攻击者提供敏感信息:display_errors=off。

  2. 以日志的方式记录错误信息:log_errors=on和error_log=filename,定期排查,Web日志最好也查。

  3. 不要用具有FILE权限的账号(比如root)连接MySQL,这样就屏蔽了load_file等危险函数。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江拥羡橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值