1.简单sql防注入

简述:

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。

在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

magic_quotes_gpc的一点认识 以及addslashes addcslashes区别:

1、条件: magic_quotes_gpc=off

写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据: $data=”snow\'\'\'\'sun” ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:”snow\'\'\'\'sun” 写入数据库,

结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

2、条件: magic_quotes_gpc=off

写入数据库的字符串经过函数addslashes()处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\'\'\'\'sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\'\'\'\'sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\'\'\'\'sun (和输入一样)

输出数据格式:snow\'\'\'\'sun (和输入一样)

说明: addslashes()函数将单引号转换为\\\'的转义字符使sql语句成功执行,但\\\'并未作为数据存入数据库,数据库保存的是snow\'\'\'\'sun 而并不是我们想象的snow\\\'\\\'\\\'\\\'sun

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误

3、条件: magic_quotes_gpc=on

写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\'\'\'\'sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\'\'\'\'sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\'\'\'\'sun (和输入一样)

输出数据格式:snow\'\'\'\'sun (和输入一样)

说明: magic_quotes_gpc=on 将单引号转换为\\\'的转义字符使sql语句成功执行,但\\\'并未作为数据入数据库,数据库保存的是snow\'\'\'\'sun而并不是我们想象的snow\\\'\\\'\\\'\\\'sun。

4、条件: magic_quotes_gpc=on

写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\'\'\'\'sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\'\'\'\'sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\\\'\\\'\\\'\\\'sun (添加了转义字符)

输出数据格式:snow\\\'\\\'\\\'\\\'sun (添加了转义字符)

说明: magic_quotes_gpc=on 将单引号转换为\\\'的转义字符使sql语句成功执行

addslashes又将即将写入数据库的单引号转换为\\\',后者的转换被作为数据写入

数据库,数据库保存的是snow\\\'\\\'\\\'\\\'sun

总结如下:

1、对于magic_quotes_gpc=on的情况

我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2、对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时。

magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据。

另外:

addslashes()函数的作用是为字符串里面的部分字符添加反斜线转义字符,addslashes()函数只为4个字符添加转义,单引号“’ ”,双引号“””,反斜线“\\”和NULL(“\\0”)。

addcslashes()函数的作用也是对字符串添加转义,但是转义的字符必须由第二个参数指定,第二个参数的使用方法难度太高,跳过不讲。

stripslashes()函数的作用和addslashes()函数正好相反,可以将 addslashes()函数转义的那4个字符取消转义。

同样,stripcslashes()函数的作用和addcslashes()函数相反。

quotemeta()函数的作用是对11个特定字符进行转义,包括:. \\ + * ? [ ^ ] ( $ ) 似乎是可以用在正则里面。

echo addslashes(\"\'\\\"\\ \");

// 显示 \\\'\\\"\\\\

echo addcslashes(\"zoo[\'.\']\", \'zo\');

// 显示 \\z\\o\\o[\'.\']

echo addcslashes(\"z\\\"oo[\'.\']\", \'\\\'\\\"\');

// 显示 z\\\"oo[\\\'.\\\']

echo addcslashes(\'foo[ ]\', \'A..z\');

// 显示 \\f\\o\\o\\[ \\]

echo stripslashes(addslashes(\"\'\\\"\\ \"));

// 显示 \'\"\\

echo stripcslashes(addcslashes(\"z\\\"oo[\'.\']\", \'\\\'\\\"\'));

// 显示 z\"oo[\'.\']

echo quotemeta(\". \\ + * ?\");

// 显示 \\. \\\\ \\+ \\* \\?

补充:

get_magic_quotes_gpc

取得 PHP 环境变量 magic_quotes_gpc 的值。

语法:        long get_magic_quotes_gpc(void);   

返回值:     返回 0 表示关闭本功能;   

返回 1 表示本功能打开。   

当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。

解决方案,检查用户提交的值的类型:

从前面的讨论中我们看到,迄今为止,SQL注入的主要来源往往出在一个意料之外的表单入口上。

然而,当你经由一个表单向用户提供机会提交某些值时,你应该有相当的优势来确定你想取得什么样的输入内容-这可以使得我们比较容易地检查用户入口的有效性。

在以前的文章中,我们已经讨论过这样的校验问题;所以,在此,我们仅简单地总结当时我们讨论的要点。

如果你正在期望一个数字,那么你可以使用下面这些技术之一来确保你得到的真正是一个数字类型:

  · 使用is_int()函数(或is_integer()或is_long())。

  · 使用gettype()函数。

  · 使用intval()函数。

  · 使用settype()函数。

为了检查用户输入内容的长度,你可以使用strlen()函数。

为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它几乎一定能够确保一位用户的入口中没有包含分号字符(除非标点符号可以被合法地包括在内)。

你可以借助于strpos()函数容易地实现这一点,如下所示:

if( strpos( $variety, ';' ) ) exit ( "$variety is an invalid value for variety!" );

正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你应该能够很容易地检查出其中存在的许多问题。

从你的查询中滤去每一个可疑字符 。

尽管在以前的文章中,我们已经讨论过如何过滤掉危险字符的问题;但是在此,还是让我们再次简单地强调并归纳一下这个问题:

· 不要使用magic_quotes_gpc指令或它的"幕后搭挡"-addslashes()函数,此函数在应用程序开发中是被限制使用的,并且此函数还要求使用额外的步骤-使用stripslashes()函数。

· 相比之下,mysql_real_escape_string()函数更为常用,但是也有它自己的缺点。

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

区别:

addslashes() 是强行加;

mysql_real_escape_string()  会判断字符集,但是对PHP版本有要求;

mysql_escape_string不考虑连接的当前字符集。

MYSQLl防注入的更多相关文章

  1. 简单实用的PHP防注入类实例

    这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下   本文实例讲述了简单实用的PHP防注 ...

  2. [转]PDO防注入原理分析以及使用PDO的注意事项

    原文:http://zhangxugg-163-com.iteye.com/blog/1835721 好文章不得不转. 我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答 ...

  3. SQL防注入程序

    1.在Global.asax.cs中写入: protected void Application_BeginRequest(Object sender,EventArgs e){      SqlIn ...

  4. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

  5. PDO防注入原理分析以及使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  6. php防注入留言板(simple)

    新手学php,试手案例便是留言板.以前未连接数据库时,我是直接将用户输入的留言写入到一个txt,然后再从txt读取显示(~.~别鄙视). 最近学习了php访问MySQL数据库的一些知识,重写了一下留言 ...

  7. 万能写入sql语句,并且防注入

    通过perpare()方法和检查字段防sql注入. $pdo=new PDO('mysql:host=localhost;dbname=scms', 'root' ); $_POST=array('t ...

  8. PDO防注入原理分析以及使用PDO的注意事项 (转)

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下两个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  9. mysql基础三(视图、触发器、函数、存储过程、事务、防注入)

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 -格式:CREATE ...

随机推荐

  1. 如何设计一个更好的C++ ORM

    2016/11/26 "用C++的方式读写数据库,简直太棒了!" 上一篇相关文章:如何设计一个简单的C++ ORM (旧版代码)

  2. Windows7服务无法启动的解决

    这周六,我接到了一个很诡异的案例,表现为任务栏右下角网络连接图标始终为一个红叉,已排除网卡硬件.链路和网卡驱动的问题.主板都新换了一块,可是问题依旧,这无疑将问题的根源指向了操作系统.本想通过网络疑难 ...

  3. mvc 路由 使用

    url 特性路由: 特性路由可以在 controller和action里面自定义路由规则  这种方式比较灵活  缺点就是不能很好的统一管理url 注册特性路由: public static void ...

  4. sql - 查询所有表中包含指定值

    可以直接创建sql语句: CREATE TABLE qResults (tName nvarchar(370), cname nvarchar(3630),[count] int) declare @ ...

  5. Winform获取应用程序的当前路径

    //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Assembly.Location; result: X:\xxx\xxx\xxx.exe ...

  6. mac下安装配置nginx环境

    本文介绍 nginx 在mac上的安装. 我是通过brewhome 来安装的. brew install nginx 一路顺畅. 下面是安装信息. 复制代码 代码如下: hematoMacBook-P ...

  7. 【转】iOS开发常用的第三方类库

    原文: http://blog.csdn.net/xiazailushang/article/details/9716043 在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使 ...

  8. 使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题

    今天接触到一个新的UI调试工具教程如下: iOS真机UI调试利器——Reveal 引入增加-ObjC -framework Reveal指令后,发现项目出现多重静态库冲突问题, 首先介绍一个指令: - ...

  9. mysql 刘道成视频教程 第3课

    第3课: 1.mysql中条件使用关键字where: 2.查 select name,content from msg ; select name,content 控制列 where id>2 ...

  10. 实例分析jdom和dom4j的使用和区别

    对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于xml的解析看不懂的可以先去看下我之前关于do ...