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#中的两种debug方法

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下   第一种:需要把调试方法改成debug代码用 #if DEBU ...

  2. 第二篇:杂项之图像处理pillow

    杂项之图像处理pillow   杂项之图像处理pillow 本节内容 参考文献 生成验证码源码 一些小例子 1. 参考文献 http://pillow-cn.readthedocs.io/zh_CN/ ...

  3. 使用Android Studio时so文件打包不到APK中

    1,需要在build中添加如下配置,这是必备的 Android {   sourceSets {       main {           jniLibs.srcDirs = ['libs']   ...

  4. js 连续赋值

    无意中网上发现的这个问题,预想的结果和真实的结果大相径庭. var a={n:1} var b=a; a.x=a={n:2} console.log(a.x); console.log(b.x); u ...

  5. 反射+javacsv+scv文件构建资源获取

    1.反射之前已经写过,大家可以在http://www.cnblogs.com/myadmin/p/5282628.html中大概了解下.同时请大家指正. javacsv.jar:java中用来处理cs ...

  6. Android基础问题汇总

    一.android:gravity 和android:layout_gravity的区别: android;gravity是自己的内容相对于自己的控件的位置,而android:layout_gravi ...

  7. C++ 实现01背包动态规划

    简述一下01背包: 背包容量大小固定,有一些物品,每个物品都有重量和价值两个属性,且物品唯一不重复(即同一物品只能放入一个),放入物品的总重量不能超过背包容量 ,求放入背包的物品的总价值最大化.0代表 ...

  8. VMware虚拟机中如何安装VMWare-Tools详解

    VMware虚拟机中如何安装VMWare-Tools详解 好处:可以支持图形界面,可以支持共享文件功能等 VMware虚拟机中如何配置显 VMware作为一款虚拟机利器,很多人都利用它来实现Linux ...

  9. oracle查看用户信息

    1.查看所有用户:select * from dba_users; select * from all_users; select * from user_users;2.查看用户或角色系统权限(直接 ...

  10. 制作font-icon有感

    连日来有些空闲,趁着这闲余时间,我尝试亲自制作一些Font-Icon,让以后可以运用到工作中.但是基于本人水平有限,PS操作只能以非常基础来形容,而AI呢,根本就只会放大操作.在这过程真的非常感谢设计 ...