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. openfire 最大连接数调优

    https://community.igniterealtime.org/thread/48064#224126 https://community.igniterealtime.org/thread ...

  2. 面试题收集——Java基础部分(一)

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3641769.html 感谢! 1.一个".java"源文件中是否可以包括多个类(不是内部类) ...

  3. http://blogs.msdn.com/b/pranavwagh/archive/2007/03/03/word-2007-file-seems-to-be-deleted-when-you-open-and-save-it-using-dsoframer.aspx

    http://blogs.msdn.com/b/pranavwagh/archive/2007/03/03/word-2007-file-seems-to-be-deleted-when-you-op ...

  4. ArcObjects10.0引用控件报错

    错误如下:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS comp ...

  5. UVALive 5888 Stack Machine Executor (栈+模拟)

    Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26636 Description http://7xjob4.c ...

  6. HD1013Digital Roots

    Problem Description The digital root of a positive integer is found by summing the digits of the int ...

  7. reentrant可重入函数

    在多任务操作系统环境中,应用程序的各个任务是并发运行的,所以会经常出现多个任务“同时”调用同一个函数的情况.这里之所以在“同时” 这个词上使用了引号,是因为这个歌”同时“的含义与我们平时所说的同时不是 ...

  8. nyoj 119 士兵杀敌(三)(RMQ)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  9. TCP三次握手及四次挥手详细图解(未完)

    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: (完成三次握手,客户端与服务器开始传送数据) 所谓三次握手(Three-way Handshake),是指建立一 ...

  10. 2013-2014集训之DP

    第一周: 经过漫长的时间,终于有时间来写一下结题报告. 地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=36180#overview A ...