extract()变量覆盖

版权声明:a3uRa QQ:962620891 github:asuralinmo.github.io https://blog.csdn.net/qq_41173457/article/details/81407535

PHP extract() 函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
下面是PHP的超级全局变量,可以了解一个特性,全是数组。
G L O B A L S , _SERVER, 服务器环境变量数组
G E T G E T _POST, 通过POST方法传递给脚本的变量数组
C O O K I E c o o k i e _REQUEST,所有用户输入的变量数组,包括 G E T , _POST和 C O O K I E _FILES,与文件上传相关得变量数组
E N V _SESSION,会话变量数组
可以通过本地测试一下 phpstudy
写入 1.php

<?php
var_dump($_GET);
?>

访问http://127.0.0.1/test2.php?key=123&b=85f 得到array(2) { [“key”]=> string(3) “123” [“b”]=> string(3) “85f” }
extract(array,extract_rules,prefix)

<?php 
$a = 'Original'; 
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); 
extract($my_array); 
echo "\$a = $a; \$b = $b; \$c = $c"; 
?> 

输出:
a = C a t ; b = Dog;
$c = Horse

<?php 
$a = 'Original'; 
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); 
extract($my_array, EXTR_PREFIX_SAME, 'dup'); 
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;"; 
?> 

输出:
a = O r i g i n a l ; b = Dog;
c = H o r s e ; dup_a = Cat;
前缀和数组键名之间会自动加上一个下划线。
extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值
可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取 P O S T _GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html

<form action="action.php" method="post"> 
<input type="text" name="username"> 
<input type="password" name="password"> 
<input type="submit"> 

在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php

<?php 
extract($_POST); 
//相当于$username = $_POST['username']; 
//$password = $_POST['password']; 
?> 
<form action = "1.php" method="post">
<input type="text" name="ai">
<input type="submit" value="tijiao">
</form>
1.php
<?php
@extract($_POST,EXTR_SKIP);
echo $ai
?>

当输入 jkl 输出 为 jkl 可以看到 我们没有用 P O S T a
把数组中的键名直接注册为了变量,就像把 P O S T [ a i ] ai
安全的做法是确定register_globals=OFF后,在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖。

<?php
$auth='0';
extract($_GET);
if($auth==1){
echo "private!";
}
else{
echo "public!";
}
?>

当构造http://www.a.com/x.php?auth=1时,可打印出private!

猜你喜欢

转载自blog.csdn.net/qq_41173457/article/details/81407535