


淺談 PHP 變量可用字符
添加時(shí)間:2014-12-1 20:28:34
添加:
思海網(wǎng)絡(luò)
先來說說php變量的命名規(guī)則:
(1) PHP的變量名區(qū)分大小寫;
(2) 變量名必須以美元符號(hào)$開始;
(3) 變量名開頭可以以下劃線開始;
(4) 變量名不能以數(shù)字字符開頭.
其實(shí)所有編程都類似的命名規(guī)范就是:
1. 變量第一個(gè)字符最好是 字母或_,不能以數(shù)字開頭
2. 第二個(gè)字符開始允許 數(shù)字,字母,_
以下示例:
<?php
if ($_POST) {
$chr = chr($_POST['chr']);
eval('$'.$chr."=1;");
echo 'ok';
exit;
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<
src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></>
</head>
<body>
<>
for(var i = 0x00; i <= 0xFF; i++) { // 0x00 - 0xFF 255個(gè)字符
$.ajaxSettings.async = false; // 同步模式, 為了按順序返回?cái)?shù)據(jù)
$.post( "?", {chr: i}, (function (data) { // post i 給 php 解析
data === 'ok' && console.log( "\\x"+(i).toString(16) );
// 如果只返回 ok 說明能正常執(zhí)行,否則會(huì)拋出異常
});
}
</>
</body>
</html>
代碼還算比較簡單,PHP 部分只負(fù)責(zé)解析每一個(gè)字符當(dāng)作變量名的執(zhí)行結(jié)果是否會(huì)拋出溢出。
比如 字符 a 那么會(huì)解析 eval('$a=1;'); 這樣的結(jié)果肯定沒問題,所以不會(huì)拋出異常,返回結(jié)果就是 ok 字符。
如果 字符 - 那么會(huì)解析 eval('$-=1;'); 這明顯是不對(duì)的,所以會(huì)拋出 PHP Parse error: syntax
error, unexpected '-', expecting T_VARIABLE or '$' 和 ok 字符。
而下面的 ajax 部分者正是利用返回結(jié)果是否為 'ok' 而判斷是否是有效的變量名。
看看執(zhí)行后的結(jié)果是什么吧:
"\x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c,
\x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59,
\x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b,
\x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78,
\x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89,
\x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96,
\x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3,
\xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0,
\xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd,
\xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca,
\xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7,
\xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4,
\xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1,
\xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe,
\xff"
整理后發(fā)現(xiàn)是這樣的16進(jìn)制數(shù)據(jù),當(dāng)然看不懂沒關(guān)系,看下轉(zhuǎn)義后的結(jié)果:
"A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y,
Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y,
z, , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, , ¡, ¢, £, ¤, ¥, |, §, ¨, ©, a, «, ¬, -, ®, ˉ, °, ±, 2, 3,
′, μ, ¶, ·, ¸, 1, o, », ¼, ½, ¾, ¿, à, á, Â, Ã, Ä, Å, Æ, Ç, è, é, ê, Ë, ì, í, Î,
Ï, D, Ñ, ò, ó, Ô, Õ, Ö, ×, Ø, ù, ú, Û, ü, Y, T, ß, à, á, a, ã, ä, å, æ, ç, è, é,
ê, ë, ì, í, î, ï, e, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, y, t, ÿ"
除了前面的 A-Z_a-z 是我們熟悉的,后面的那些亂七八糟的東西竟然也能當(dāng)作正常的變量名,簡直不可思議。
其實(shí)只是PHP拓展了變量名的字符范圍,在 A-Z_a-z 之上,將變量可用字符范圍拓展到了 \x7f-\xff。
所以,第一個(gè)字符范圍應(yīng)該是 [a-zA-Z_\x7f-\xff]
那么第二個(gè)字符是否也是這樣能,我們繼續(xù)測(cè)試下。
將上面 php 代碼里的 eval('$'.$chr."=1;"); 改成 eval('$a'.$chr."=1;");
保存測(cè)試、
"\x9, \xa, \xd, \x20, \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38,
\x39, \x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c,
\x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59,
\x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b,
\x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78,
\x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89,
\x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96,
\x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3,
\xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0,
\xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd,
\xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca,
\xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7,
\xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4,
\xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1,
\xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe,
\xff"
發(fā)現(xiàn)結(jié)果多了好多字符,其實(shí)有一部分我們是要去掉的,比如 \x20 其實(shí)就是 空格,相當(dāng)于 eval('$a =1;');
而已,當(dāng)然是能正常執(zhí)行的。
除了空格,還有 \t\r\n 都去掉因?yàn)檫@些也是PHP語法說允許的 \t=\x9,\n=\xa,\r=\xd,所以我們要去掉結(jié)果中的前4個(gè)數(shù)據(jù)\x9,
\xa, \xd, \x20,
最終得到的結(jié)果其實(shí)只是多了 \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38, \x39
熟悉 ascii 的人也許一眼就看出來了,這就是數(shù)字 0-9
所以第一個(gè)字符范圍應(yīng)該是 [\w\x7f-\xff] 對(duì)正則不熟的也許會(huì)覺得怎么不是 [0-9a-zA-Z_\x7f-\xff],其實(shí) \w 就是
0-9a-zA-Z_
也許有人會(huì)說 $$a; ${$a}; 這樣的變量呢?我覺得這個(gè)已脫離了變量命名的范圍了。
關(guān)鍵字:PHP、變量
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解