magic_quotes_gpc(魔术引号开关)
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(魔术引号开关)的更多相关文章
- magic_quotes_sybase(魔术引号开关)
magic_quotes_sybase,如果该选项在php.ini文件中是唯一开启的话,将只会转义%00为\0(即null字符).此选项会完全覆盖magic_quotes_gpc.如果同时开启这两个选 ...
- magic_quotes_runtime(魔术引号开关)
我们可以通过以下代码来探测php环境中magic_quotes_runtime是否开启: magic_runtime.php 源代码如下: <?php //当magic_quotes_runti ...
- 什么是PHP魔术引号
今天在读EcShop的源码中发现里面有几个地方涉及到了PHP魔术引号,之前也碰到过都忽略过去了,再次碰到该深入的理解,虽然自PHP 5.3.0 起魔术引号被废弃废弃并将自 PHP 5.4.0 起移除, ...
- PHP 魔术引号
1.魔术引号的作用是什么? 魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号.双引号.反斜线.NULL加上一个一个反斜线进行转义,这个的作用跟addslashes( ...
- PHP之魔术引号
什么是魔术引号 Warning 本特性已自 PHP5.3.0起废弃并将自PHP5.4.0起移除. 当打开,所有的'(单引号),"(双引号), (反斜线)和NULL 字符都会被自动加上一个反 ...
- WEB安全 魔术引号及注入类型
一.魔术引号 1. magic_quotes_gpc 变量 什么是魔术引号 Warning本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除.当打开时,所有的 '(单引号),&q ...
- char函数绕过魔术引号注入
我目前学习到的绕过魔术引号的几种方法(如果知道还有别的请万望告之): 1.倘若服务端是GBK可以尝试宽字节注入 2.使用char函数绕过魔术引号进行注入 3.同char函数类似的函数,例如bin(转换 ...
- PHP安全设置
1.register_globals(全局变量注册开关) 2.magic_quotes_gpc(魔术引号开关) 3.magic_quotes_runtime(魔术引号开关) 4.magic_quote ...
- PHP的核心配置详解
1.PHP核心配置详解 代码在不同的环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用:也可能你已经找到的一个漏洞就因为你的配置问题,导致你鼓捣很久都无法构造成功的漏 ...
随机推荐
- SCAU 13校赛 17115 ooxx numbers
17115 ooxx numbers 时间限制:1000MS 内存限制:65535K 题型: 编程题 语言: 无限制 Description a number A called oo numbe ...
- js运动 缓冲运动
<!DOCTYPE HTML> <HTML> <meta http-equiv="Content-Type" content="text/h ...
- 第一百九十六天 how can I 坚持
老妈邮的咸菜到了,美味啊,买不到,哈哈. 以后要勤给鱼换水啊,10天不换,水都臭了,拒绝懒惰. 明天要回济南了,刘松结婚,估计又没法发博客了. 两条鱼,一条罗娜,一条我,哈哈. 睡觉.
- 转】Maven学习总结(九)——使用Nexus搭建Maven私服
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4068967.html 感谢! 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很简单,有些公司都不提 ...
- 如何判断ios设备是否是高清屏幕
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2f) { CGRect winRect = [[UIScreen m ...
- http://acm.hdu.edu.cn/showproblem.php?pid=2579
#include<stdio.h> #include<string.h> #include<queue> #define N 110 int m, n, k, x1 ...
- Deep Learning 学习笔记——第9章
总览: 本章所讲的知识点包括>>>> 1.描述卷积操作 2.解释使用卷积的原因 3.描述pooling操作 4.卷积在实践应用中的变化形式 5.卷积如何适应输入数据 6.CNN ...
- Python基础 字符串的魔法
capitalize(self) 返回值:将字符串的第一个首字母变成大写,其他字母变小写 s = 'hello World' ss = s.capitalize() print(ss) Hello w ...
- “非常PHP学习网”(www.veryphp.cn)一期上线
制作“非常PHP学习网”花了国庆整个假期,其实是从电脑学习网(http://www.why100000.com,域名刚续费)改写盗版而来的. 起初主要修改界面布局和颜色花费了大量时间(好像制作网站80 ...
- Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介
http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html