PHP中自动转义--小结

来源:互联网 发布:外国人吃中国食物 知乎 编辑:程序博客网 时间:2024/06/10 09:45

<?php

magic_quotes_gpc

作用范围 服务端

作用时间 请求开始时

影响 会影响通过get|post|cookies获得的数据

magic_quotes_runtime

作用范围 从文件中读取的数据|执行exec()的结果|从sql得到数据

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

一般用法

if(get_magic_quotes_gpc()){$data=$_POST["key"];}

else{$data=addslashes($_POST["key"]);}

?>

PHP提供两个方便我们引用数据的魔法引用函数 magic_quotes_gpc和magic_quotes_runtime,这两个函数如果在php.ini设置为ON的时候,就会为我们引用的数据 碰到单引号'和双引号"以及反斜线 \ 是自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的 magic_quotes_gpc和magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情 况。那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:

magic_quotes_gpc 
作用范围是:WEB客户服务端; 
作用时间:请求开始是,例如当脚本运行时. 
magic_quotes_runtime 
作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的; 
作用时间:每次当脚本访问运行状态中产生的数据. 
所以 
magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据 
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据 
例子说明: 
复制内容到剪贴板 
代码: 
<form action="" method="post" > 
STR:<input type="text" > 
<input type="submit"> 
</form> 
<?php 
/* 我们在表单里填写: '"\ 这些符号,如果magic_quotes_gpc没有开启,那么他们不会被反斜杠转义 */ 
echo '现在通过POST传递过来的值是:' ,$_POST['str'], ' 
'; 
if (get_magic_quotes_gpc()) { ,forex; // 检查magic_quotes_gpc是否打开,如果没有打开,用addslashes进行转义 
$str = $_POST['str']; 
} else { 
$str = addslashes($_POST['str']); 

echo '这里是转义过后的:' ,$str, '<hr />'; 
$sql = "INSERT INTO lastnames (lastname) VALUES ('$str')"; 
//================================================ ===================================== 
//-----magic_quotes_gpc只会转义: 通过Get/Post/Cookies获得的数据 
//-----magic_quotes_runtime会转义:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的 
//================================================ ===================================== 
$data = http://blog.soso.com/qz.q/implode(file('try.php')); // 我们在里面依然写'"\这几个字符,用来测试 
echo '这里是try.php的数据,'; 
if (get_magic_quotes_runtime()) { 
$data = http://blog.soso.com/qz.q/$data; 
echo '被系统自带转义的' .$data; 
} else { 
echo '被addslashes转义了的' .$data = http://blog.soso.com/qz.q/addslashes($data); 

$sql = "INSERT INTO lastnames (lastname) VALUES ('$data')"; 
echo ' 
SQL语句为: 
' ,$sql; 
//---入库都转义了,但是多余了反斜杠,我们要读出来是原来的数据时候使用stripslashes()去掉反斜杠 
//---stripslashes()和addslashes()作用相反 
?> 
最关键的区别是就是上面提到的2点:他们针对的处理对象不同 
magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据 
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据 
在这里顺便在提几个想关联的函数: 
set_magic_quotes_runtime(): 
设置magic_quotes_runtime值. 0=关闭.1=打开.默认状态是关闭的.可以通过 echo phpinfo(); 查看magic_quotes_runtime 
get_magic_quotes_gpc(): 
查看magic_quotes_gpc值.0=关闭.1=打开. 
get_magic_quotes_runtime(): 
查看magic_quotes_runtime值。0=关闭.1=打开. 
注意的是没有 set_magic_quotes_gpc()这个函数,就是不能在程序里面设置magic_quotes_gpc的值。 
================================================== ===== 
使用stripslashes去掉转义,使用addslashes添加转义字符。 
string addslashes ( string str) 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(\')、双引号(\")、反斜线(\\)与 NUL(NULL 字符) stripslashes作用相反在处理mysql和GET、POST的数据时,常常要对数据的引号进行转义操作。 PHP中有三个设置可以实现自动对'(单引号),"(双引号),\\(反斜线)和 NULL 字符转移。 PHP称之为魔术引号,这三项设置分别是 magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。 
不能在运行时改变。在 PHP 中默认值为 on。 magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off。 magic_quotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 "。而双引号、反斜线和 NULL 字符将不会进行转义。虽然方便的实现了对特殊符号的自动转义,但是这样会使得程序效率降低,并导致程序可移植变得麻烦。在不知道服务器ini设置的情况 下,还需要调用get_magic_quotes_gpc() ,get_magic_quotes_runtime() 或ini_get()来检测状态。