php mysql自动反转义_[转]PHP的自动加反斜杠转义(magic_quotes_gpc和magic_quotes_runtime)...

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

单引号(’)、双引号(”)、反斜线()与 NUL(NULL

字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下

进行了。(这个特性在PHP5.3.0中已经废弃并且在5.4.0中已经移除了(This feature has been

DEPRECATED as of PHP 5.3.0 andREMOVED as of PHP

5.4.0.)(引发的思考:更换PHP版本需注意转义的变化和处理)在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖

这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。

当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1

当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0

因此可以看出这个get_magic_quotes_gpc()函数的作用就是得到环境变量magic_quotes_gpc的值。既然在PHP6中删除了magic_quotes_gpc这个选项,那么在PHP6中这个函数我想也已经不复存在了。

php

判断是否开启get_magic_quotes_gpc功能了,以方便我们是否决定使用addslashes这个函数了。

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;

}

预防数据库攻击的正确做法

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”, “hello”, “321″);

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);

http://www.php100.com/html/php/hanshu/2013/0905/4689.html

stripslashes() 函数删除由 addslashes()

函数添加的反斜杠

htmlspecialchars

把预定义的字符 "" (大于)转换为 HTML 实体。

strip_tags()

函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

也可以获取配置项判断:

ini_get('magic_quotes_gpc')

特殊字符在SQL中将报错,需要\转义,转义后才能存储该特殊字符,比如'要存入必须\’转义后才能正常执行存储,存储后数据库中是'而不是\',输出也是

'。如下:

------------------------------------------------------

http://www.jb51.net/article/38990.htm

PHP

magic_quotes_gpc主要是作用在WEB客户服务端的,它的作用时间是从请求开始,接下来我们将具体的为大家讲解它的使用方式。

AD:我们今天要向大家介绍的是PHP

magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用。

•PHP函数preg_split的正确使用方法

•解读PHP函数explode()的具体使用方法

•PHP函数implode()与explode()函数的不同

•PHP类CMS如何自动获取关键字

•探讨PHP函数split()如何使用正则表达式切

1.

条件:PHP

magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。

2.

条件:PHP

magic_quotes_gpc=off写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow”''sun (和输入一样)

输出数据格式:snow”''sun (和输入一样)

说明: addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,

但\'并未作为数据存入数据库,数据库保存的是snow”''sun 而并不是我们想象的snow\'\'\'\'sun

3.

条件:PHP

magic_quotes_gpc=on写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow”''sun (和输入一样)

输出数据格式:snow”''sun (和输入一样)

说明: PHP magic_quotes_gpc=on

将单引号转换为\'的转义字符使sql语句成功执行,

但\'并未作为数据入数据库,数据库保存的是snow”''sun而并不是我们想象的snow\'\'\'\'sun。

4.

条件:PHP

magic_quotes_gpc=on写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据:$data=”snow”''sun” ; (snow和sun之间是四个连续的单引号).

操作:将字符串:”snow”''sun” 写入数据库,

结果:sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\'\'\'\'sun (添加了转义字符)

输出数据格式:snow\'\'\'\'sun (添加了转义字符)

说明: PHP magic_quotes_gpc=on

将单引号转换为\'的转义字符使sql语句成功执行,

addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入

数据库,数据库保存的是snow\'\'\'\'sun

-------------(综上,magic_quotes_gpc布置对传输数据POST,GET,COOKIE有效对 执行SQL语句入库 的 数据也有效)

总结如下:1. 对于PHP

magic_quotes_gpc=on的情况,我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。-------(处理对POST,GET,COOKIE自动处理还对 插入数据库的数据自动转义,注意是数据不是整个SQL语句)

如果此时你对输入的数据作了addslashes()处理,

那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于PHP magic_quotes_gpc=off

的情况必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:PHP

magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.

magic_quotes_runtime

作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

这个特性在PHP5.3.0中已经废弃并且在5.4.0中已经移除了(This feature has been

DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP

5.4.0.)。所以没有理由再使用魔术引号,因为它不再是 PHP 支持的一部分。

不过它帮助了新手在不知不觉中写出了更好(更安全)的代码。 但是在处理代码的时候,最好是更改你的代码而不是依赖于魔术引号的开启。

----------------------------------

http://www.jb51.net/article/35868.htm

基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍

当你的数据中有一些 \ ” ‘

这样的字符要写入到数据库里面,又想不被过滤掉的时候,它就很有用,会在这些字符前自动加上\,如

中国\地大物博”哈哈”

中国\\地大物博\”哈哈\”

可以使用set_maginc_quotes_runtime(0)关闭掉,当然你也可以直接在php.ini中设置。

get_magic_quotes_runtime() 取得 PHP 环境变量

magic_quotes_runtime 的值。

magic_quotes_gpc 为 on,它主要是对所有的

GET、POST 和 COOKIE 数据自动运行

addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用

addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc()

进行检测。

两者不同

set_magic_quotes_runtime()

可以让程序员在代码中动态开启或关闭 magic_quotes_runtime,

set_magic_quotes_runtime(1) 表示开启,set_magic_quotes_runtime(0)

则表示关闭。当set_magic_quotes_runtime(1) 时,从数据库或通过fread之类的函数读取的文本,将自动对'

“和\自动加上反斜杠\进行转义,防止溢出。这在对数据库的数据进行转移的时候非常有用。但在一般情况下,应当将其关闭,否则从数据库读取出来的数据单引

号、双引号和反斜杠都会被加上\,导致显示不正常。像Discuz,PHPWind都在公共文件的头部加上一句 set_magic_quotes_runtime(0);

强制关闭 magic_quotes_runtime 。

magic_quotes_gpc

作用范围是:WEB客户服务端;

作用时间:请求开始是,例如当脚本运行时.

magic_quotes_runtime

作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;

作用时间:每次当脚本访问运行状态中产生的数据.

所以

magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据,

magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据,

magic_quotes_gpc 是对通过GET、POST、COOKIE传递的数据进行转义,一般在数据入库前要先进行转义,

magic_quotes_gpc不能在代码中动态开启或关闭,需要到php.ini将magic_quotes_gpc设置为on或off,

代码中可以用get_magic_quotes_gpc获取magic_quotes_gpc的状态。

当magic_quotes_gpc为off时,需要手工对数据进行addslashes,代码如下:

复制代码 代码如下:

if (!get_magic_quotes_gpc()) { new_addslashes($_GET); new_addslashes($_POST); new_addslashes($_COOKIE); } function new_addslashes($string)

{ if (is_array($string)) { foreach ($string as $key => $value) { $string[$key] = new_addslashes($value); } } else { $string = addslashes($string); } return $string; }

另一示例:

复制代码 代码如下:

$data1 = $_POST['aaa']; $data2 =

implode(file('1.txt')); if (get_magic_quotes_gpc())

{ //把数据$data1直接写入数据库 } else { $data1 = addslashes($data1); //把数据$data1写入数据库 } if

(get_magic_quotes_runtime()){ //把数据$data2直接写入数据库 //从数据库读出的数据要经过一次stripslashes()之后输出

(由于打开,输出时自动再加反斜杠要去除回去)

} else { $data2 = addslashes($data2); //把数据$data2写入数据库 //从数据库读出的数据直接输出 }

++++++++++++++++++++++++++++++++++++++++++++++++++++++

经验总结:

一、对于GPC,不管系统有没有开启magic_quotes_gpc(即php.ini中magic_quotes_gpc =

On),我们统一开启 magic_quotes_gpc,对get、post、cookie的内容进行转义。操作如下:

(摘自uchome系统)

复制代码 代码如下:

function saddslashes($string) { if (is_array($string)) { foreach ($string as $key => $val) { $string[$key] = saddslashes($val); } } else { $string = addslashes($string); } return $string; } //GPC过滤 $magic_quote =

get_magic_quotes_gpc(); if(empty($magic_quote)) { $_GET = saddslashes($_GET); $_POST = saddslashes($_POST); } //COOKIE,给cookie值转义 $prelength =

strlen($_SC['cookiepre']); foreach ($_COOKIE as $key => $val)

{ if(substr($key, 0, $prelength) == $_SC['cookiepre'])

{ $_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ?

saddslashes($val) : $val; } }

二、

对于magic_quotes_runtime,我们统一关闭它,即set_magic_quotes_runtime(0);不让从数据库读取出来的数

据的单引号、双引号和反斜杠都自动被加上\。这样,对数据库的操作如下:添加数据到数据库之前,我们手动对数据进行addslashes(),而从数据库

取出数据时,则作相反操作,即stripslashes()。--这里晕了,自动一次不需要相反啊??

三、对于要序列化的内容,要保持裸数据,即要去掉转义,stripslashes(),然后在把序列化过的内容保存到数据库当中(注意,序列化过的内容是不带单引号(')、双引号(”)、反斜线(\)的),示例如下:

$feedarr['body_data'] = serialize(stripslashes($body_data));

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

出现Function set_magic_quotes_runtime() is deprecated 问题?

在安装 PHPCMS出现Deprecated: Function set_magic_quotes_runtime() is

deprecated

错误,查了一下网络及资料发现是PHP5.3和PHP6.0之后移除了set_magic_quotes_runtime()函数。

我可以使用如下方案替代:

view sourceprint?

@set_magic_quotes_runtime(0);

view sourceprint?

ini_set("magic_quotes_runtime", 0);

view sourceprint?

if (phpversion() < '5.3.0')

{ set_magic_quotes_runtime(0); }

http://blog.csdn.net/yw5201314/article/details/9425457

总结如下:

1. 对于magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,

那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值