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. MY_FAVOR_火埃及

  2. Linux bash中的变量分类

    1.本地变量 VAR=XYZ 2.局部变量 local VAR=XYZ 3.环境变量 在子shell中可以起作用 export VAR=XYZ 4.位置变量 $0 脚本名本身 $1 第一个参数 $2 ...

  3. Linux终端Ctrl相关快捷键

    快速跳至行首:Ctrl+A 快速跳至行尾:Ctrl+E 向前删除至行首:Ctrl+U 向后删除至行尾:Ctrl+K 向后删一个单词:Ctrl+D 清屏:Crtl+L(clear)

  4. .NET多线程同步方法详解

    .NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...

  5. ubuntu出现有线已连接却无法上网

    或者直接追加到/etc/sysctl.conf 如果遇到“设备未托管”,一般是台式机默认移动ip后禁用网络. 那么修改/etc/NetworkManager/NetworkManager.conf,设 ...

  6. iOS 身份证最后一位是X,输入17位后自动补全X(转)

    非原创,转载自http://blog.csdn.net/l2i2j2/article/details/51542028如果身份证最后一位是X,输入17位后自动补全X// textField代理方法 - ...

  7. object-C 手动内存管理(MRC)

    object-C的内存管理和javascript的垃圾回收不一样,今天总结下手动内存管理,ARC的后边补上. 1:基本铺垫 oc采用引用计数来表示对象的状态,比如通过init创建出来的一个对象引用计数 ...

  8. 请描述一下 cookies,sessionStorage 和 localStorage 的区别?

    http://handyxuefeng.blog.163.com/blog/static/454521722013111714040259/ http://book.51cto.com/art/201 ...

  9. 初学者自学笔记-this的用法

    请注意:这是自学者的笔记,只是个人理解,并非技术分享,如有错误请指正. "this"的意思,简单而言,就是"这个",也就是"当前".谁调用它 ...

  10. ZOJ 1004 Anagrams by Stack(DFS+数据结构)

    Anagrams by Stack 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4 题目大意:输入两个字符串序列,判 ...