magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

在magic_quotes_gpc = On的情况下,如果输入的数据有

单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为Off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在 magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了。

我们可以通过以下代码来探测php环境中magic_quotes_gpc是否开启:

magic.php 源代码如下:

<?php

//当magic_quotes_gpc=On的时候,get_magic_quotes_gpc函数的返回值为1

//当magic_quotes_gpc=Off的时候,get_magic_quotes_gpc函数的返回值为0

if (get_magic_quotes_gpc())

{

echo 'magic_quotes_gpc 开启';

}

else

{

echo 'magic_quotes_gpc 未开启';

}

?>

比如我自己本地的PHP环境版本:

将magic.php 文件放在本地站点根目录之下测试,如图:

那么,说明:我的本地php环境,并没有开启magic_quotes_gpc,即,magic_quote_gpc=Off,或者magic_quote_gpc这个特性在我此时的php环境版本里面,已经被php社区废除了,那么,我在编写php代码的时候,就需要将magic_quotes_gpc设置为On,或者在php代码中使用addslashes函数对get,post,cookie等数组进行特殊字符转义,不然,此情此景,我编写的php代码就不安全了。

其实,我的本地magic_quotes_gpc默认设置如图:

接下来,介绍一下addslashes函数:

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串,预定义字符有以下这些:

他们分别是:

单引号(')

双引号(")

反斜杠(\)

NULL

例程如下(addslashes转义输入数据中的单引号):

<?php

echo '转义前:';

$str = "Who's Kevin David Mitnick?";

echo $str;

echo '<br />';

echo '转义后:';

echo addslashes($str);

?>

执行结果如下图:

问题:那么,我们怎么才能编写出安全的php代码呢?

答案:合理地使用好get_magic_guotes_gpc、magic_quotes_gpc、addslashes这3个函数。

比如,以下代码就是一些好的防MySQL注入的安全代码(php一般与MySQL配合使用),其中就涉及到了特殊字符的转义:

<?php

function SQLString($c, $t)

{

$c=(!get_magic_quotes_gpc())?addslashes($c):$c;

switch($t)

{

case 'text':

$c=($c!='')?"'".$c."'":'NULL';

break;

case 'search':

$c="'%%".$c."%%'";

break;

case 'int':

$c=($c!='')?intval($c):'0';

break;

}

return $c;

}

?>

<?php

function check_input($value)

{

//去除斜杠

if (get_magic_quotes_gpc())

{

$value = stripslashes($value);

}

//如果不是数字则加引号

if (!is_numeric($value))

{

$value = “‘” . mysql_real_escape_string($value) . “‘”;

}

return $value;

}

$con = mysql_connect(‘localhost’, ‘root’, ‘root’);

if (!$con)

{

die(‘Could not connect: ‘ . mysql_error());

}

//进行安全的SQL语句执行

$user = check_input($_POST['user']);

$pwd = check_input($_POST['pwd']);

$sql = “SELECT * FROM users WHERE user=$user AND password=$pwd”;

mysql_query($sql);

mysql_close($con);

?>

总结:

php较低版本(php version <= 5.3.0)会对所有的GET、POST和COOKIE 数据自动运行addslashes()。因为较低版本的php,magic_quotes_gpc默认开启,所以,此时您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时,可以使用函数get_magic_quotes_gpc()进行检测。

magic_quotes_gpc(魔术引号开关)的更多相关文章

  1. magic_quotes_sybase(魔术引号开关)

    magic_quotes_sybase,如果该选项在php.ini文件中是唯一开启的话,将只会转义%00为\0(即null字符).此选项会完全覆盖magic_quotes_gpc.如果同时开启这两个选 ...

  2. magic_quotes_runtime(魔术引号开关)

    我们可以通过以下代码来探测php环境中magic_quotes_runtime是否开启: magic_runtime.php 源代码如下: <?php //当magic_quotes_runti ...

  3. 什么是PHP魔术引号

    今天在读EcShop的源码中发现里面有几个地方涉及到了PHP魔术引号,之前也碰到过都忽略过去了,再次碰到该深入的理解,虽然自PHP 5.3.0 起魔术引号被废弃废弃并将自 PHP 5.4.0 起移除, ...

  4. PHP 魔术引号

    1.魔术引号的作用是什么? ​ 魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号.双引号.反斜线.NULL加上一个一个反斜线进行转义,这个的作用跟addslashes( ...

  5. PHP之魔术引号

    什么是魔术引号 Warning 本特性已自 PHP5.3.0起废弃并将自PHP5.4.0起移除. 当打开,所有的'(单引号),"(双引号),  (反斜线)和NULL 字符都会被自动加上一个反 ...

  6. WEB安全 魔术引号及注入类型

    一.魔术引号 1. magic_quotes_gpc 变量 什么是魔术引号 Warning本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除.当打开时,所有的 '(单引号),&q ...

  7. char函数绕过魔术引号注入

    我目前学习到的绕过魔术引号的几种方法(如果知道还有别的请万望告之): 1.倘若服务端是GBK可以尝试宽字节注入 2.使用char函数绕过魔术引号进行注入 3.同char函数类似的函数,例如bin(转换 ...

  8. PHP安全设置

    1.register_globals(全局变量注册开关) 2.magic_quotes_gpc(魔术引号开关) 3.magic_quotes_runtime(魔术引号开关) 4.magic_quote ...

  9. PHP的核心配置详解

    1.PHP核心配置详解 代码在不同的环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用:也可能你已经找到的一个漏洞就因为你的配置问题,导致你鼓捣很久都无法构造成功的漏 ...

随机推荐

  1. c#装B指南

    要想让自己的代码,看起来更优雅,更有逼格,更高大上,就一定要写出晦涩难懂,而又简洁的代码来. 对于类自身的全局变量,一定要加this,对于基类的,一定要加base.反射不要多,但一定要有,而且偶尔就来 ...

  2. perf

  3. 一个效果很华丽的仿桌面APP,却胜似Launcher

    开发Android APP的同学是否对于Launcher实现的绚丽效果而痴迷呢?什么,连Android Launcher是什么都不知道.好吧,拿起侬的手机,在解锁后的首页界面上左右滑动滑动,体验体验, ...

  4. labview 中的一些简写全称

    MAX:Measurement & Automation Explorer 测量自动化管理器 :可用于配置DAQ通道名称,VISA资源名称和IVI逻辑名称. DAQ: Device Data ...

  5. LabVIEW数据记录和存储—XML文件

    XML(eXtensible Markup Language)是一种目前广泛使用的数据传输和存储的格式,其本质上是一种文本文件,可以使用任何一个文本编辑工具打开和修改.类似于HTML,XML被设计为具 ...

  6. 粗解Xcode 5新特性: Asset Catalogs

    原文:http://schlu.org/2013/10/01/Xcode-Asset-Catalogs.html 基础知识 在今年的WWDC大会上苹果介绍了Asset Catalogs.Asset C ...

  7. json操作json类型转换

    前提是需要加Jar包: gson-2.2.2.jar package utils; import java.io.BufferedReader;import java.io.FileInputStre ...

  8. 行为类模式(一):职责链(Chain Of Responsibility)

    定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. UML 优点 将请求的发送者和接收者解耦 可以 ...

  9. Git版本管理:Windows下Git配置与使用指南

    简要介绍:Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. 一.安装 软件:msysGit-fullinstall-1.8.1.2 打开之后设置安装路径,默认为 ...

  10. center os 6.5 vsftpd 登陆出现 530 错误拒绝 解决方法

    别管那么多 把 /etc/vsftpd/ftpusers  里面的用户名删掉就好了.