淺談php可變變數安全

來源:互聯網
上載者:User
變變數是PHP一個非常方便的特性,手冊裡已經說了,可變變數的意思就是一個變數的變數名可以動態設定!
那麼變數的變數名可以動態設定會產生什麼安全問題呢?下面來看看:

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

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

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

<?php$a = 'phpinfo';${$a()};?>

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

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

<?php $a = "${${phpinfo()}}"; ?>

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

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

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

<?php$a = 'phpinfo()';echo $a; //輸出phpinfo()字串echo '$a'; //輸出$a字串echo "$a"; //輸出phpinfo()字串?>

雙引號裡的內容會再經過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.