PHP的可變變數名使用方法詳解_PHP教程

來源:互聯網
上載者:User
本文章來給各位同學介紹關於PHP的可變變數名使用方法,這個也是剛知道可變變數名了,大家一起來學習一下。


有時候可變的變數名會給編程帶來很大的方便。也就是說變數名可以被動態命名和使用。通常變數通過下面這樣的語句來命名 :

代碼如下 複製代碼

$a = 'hello';
?>


可變變數名指的是使用一個變數的值作為這個變數的名稱。在上面的例子中,通過使用兩個$符號,你可以把hello設定成一個變數的名稱,就像下面那樣。

代碼如下 複製代碼
$$a = 'world';
?>

通過上面的兩個語句,有兩個變數被定義:變數$a,裝的內容是”hello” 以及變數$hello,裝的內容是 “world”。 於是,下面的語言:

代碼如下 複製代碼

echo "$a ${$a}";
?>

跟下面的語句的輸出完全一致:

代碼如下 複製代碼

echo "$a $hello";
?>

它們都輸出:hello world。

為了使用數組的可變變數名,你需要解決一個歧義問題。就是,如果你寫$$a[1],解析器需要明白究竟你的意思是要把$a[1]當成一個變數,還是要把$$a當成變數、[1]指的是這個變數的索引。解決這個歧義問題的文法是:第一種情況使用${$a[1]},第二種情況使用${$a}[1]。

類屬性也可以通過可變屬性名稱來訪問。可變屬性名稱從產生調用所在的變數的存取範圍內擷取。例如,如果你的運算式是這樣的:$foo->$bar,那麼運行時將會在本地變數範圍內尋找變數$bar,它的值將會做為$foo對象的一個屬性名稱。如果$bar是個數組也可以使用。

例1 可變變數名

代碼如下 複製代碼

class foo {
var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "n";
echo $foo->$baz[1] . "n";
?>

上面的例子將會輸出下面的結果:

I am bar.

I am bar.

警告

請注意,可變變數名不能用於PHP函數和類裡的超級全域陣列變數上。變數$this也是一個不能動態取名的特殊變數。

淺談PHP可變變數安全


變變數是PHP一個非常方便的特性,手冊裡已經說了,可變變數的意思就是一個變數的變數名可以動態設定!

那麼變數的變數名可以動態設定會產生什麼安全問題呢?下面來看看:

代碼如下 複製代碼

$a = 'phpinfo';
$a();
?>


這段代碼很容易理解,變數的類型是字元型phpinfo,變數動態加上了(),於是變數變成了phpinfo函數動態執行了!



按照同樣的原理我們引用手冊中可變變數的例子:

代碼如下 複製代碼
$a = 'phpinfo';
${$a()};
?>

$a()

這個動態函數放入動態變數,當然我這個說法有點不專業,還是可變變數,我們會發現phpinfo函數還是執行了!



看過手冊還有我給出的這個例子的話,大家一定覺得這個一點都不神奇,這就是PHP的文法特性,然後我們把這個東西再進化縮成一行:

代碼如下 複製代碼

$a = "${${phpinfo()}}";

?>

這是一個2個嵌套的可變變數,我們只是按照上面一個例子將可變變數的內容自己填寫進去了,實際上就是把某個函數賦給某個變數,所以phpinfo函數最終執行了,也就化成了各種漏洞和webshell的原型!



看到這裡大家應該知道了,為什麼當初大牛們要我去看PHP手冊吧,然而本文到這裡就結束了麼,咱還漏了一點,大牛說了安全就是基礎,咱其實還沒把這個東西搞清楚,為什麼前面例子的變數是用的單引號,而後面的最終的例子用的是雙引號,如果你想到了這個問題,我覺得你做安全肯定非常有潛力,以後保不準就是一大牛!



PHP中單引號和雙引號的區別還是和變數有關,來看下面的例子:

代碼如下 複製代碼
$a = 'phpinfo()';
echo $a; //輸出phpinfo()字串
echo '$a'; //輸出$a字串
echo "$a"; //輸出phpinfo()字串
?>

雙引號裡的內容會再經過PHP的文法解析變數,而單引號裡的內容就直接定性為字串了!



所以本文到這裡就真正結束了,於是大家應該也都明白了,當初牛人為什麼和我說多看PHP手冊和安全就是基礎的深意。

http://www.bkjia.com/PHPjc/632705.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632705.htmlTechArticle本文章來給各位同學介紹關於PHP的可變變數名使用方法,這個也是剛知道可變變數名了,大家一起來學習一下。 有時候可變的變數名會給編...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.