先来说说php变量的命名规则百度下一抓一大把
(1) PHP的变量名区分大小写;
(2) 变量名必须以美元符号$开始;
(3) 变量名开头可以以下划线开始;
(4) 变量名不能以数字字符开头.
其实所有编程都类似的命名规范就是
1. 变量第一个字符最好是 字母或_不能以数字开头
2. 第二个字符开始允许 数字字母_
好了差不多就是这样了但是这不是我们要说的重点。
今天我们说说 PHP 变量的可用字符不仅仅是 数字字母_ 哦。
前几天QQ上一朋友发我一个shell是加密过的通篇乱码不过上面有注释叫做 “神盾加密” 好霸气的样子。
里面用了一些比较生僻的知识点其中最明显的就是变量名所以今天我们先从变量开始讲。
当然网上我也没找到权威的质料强有力的说明PHP的变量名可用字符的信息所以我只能自己测试了。(英文不好没办法谷歌到有利的证据)
先来看下我所用的方法如果你有更好的方法希望分享下。
<?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>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script>
</head>
<body>
<script>
for(var i = 0x00; i <= 0xFF; i++) { // 0x00 - 0xFF 255个字符
$.ajaxSettings.async = false; // 同步模式, 为了按顺序返回数据
$.post( "?", {chr: i}, (function (data) { // post i 给 php 解析
data === 'ok' && console.log( "\\x"+(i).toString(16) ); // 如果只返回 ok 说明能正常执行否则会抛出异常
});
}
</script>
</body>
</html>
代码还算比较简单PHP 部分只负责解析每一个字符当作变量名的执行结果是否会抛出溢出。
比如 字符 a 那么会解析 eval('$a=1;'); 这样的结果肯定没问题所以不会抛出异常返回结果就是 ok 字符。
如果 字符 - 那么会解析 eval('$-=1;'); 这明显是不对的所以会抛出 PHP Parse error: syntax error, unexpected '-', expecting T_VARIABLE or '$' 和 ok 字符。
而下面的 ajax 部分者正是利用返回结果是否为 'ok' 而判断是否是有效的变量名。
看看执行后的结果是什么吧
"\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"
整理后发现是这样的16进制数据当然看不懂没关系看下转义后的结果
"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-Z_a-z 是我们熟悉的后面的那些乱七八糟的东西竟然也能当作正常的变量名简直不可思议。
其实只是PHP拓展了变量名的字符范围在 A-Z_a-z 之上将变量可用字符范围拓展到了 \x7f-\xff。
所以第一个字符范围应该是 [a-zA-Z_\x7f-\xff]
那么第二个字符是否也是这样能我们继续测试下。
将上面 php 代码里的 eval('$'.$chr."=1;"); 改成 eval('$a'.$chr."=1;"); 保存测试、
"\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"
发现结果多了好多字符其实有一部分我们是要去掉的比如 \x20 其实就是 空格相当于 eval('$a =1;'); 而已当然是能正常执行的。
除了空格还有 \t\r\n 都去掉因为这些也是PHP语法说允许的 \t=\x9\n=\xa\r=\xd所以我们要去掉结果中的前4个数据\x9, \xa, \xd, \x20
最终得到的结果其实只是多了 \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38, \x39 熟悉 ascii 的人也许一眼就看出来了这就是数字 0-9
所以第一个字符范围应该是 [\w\x7f-\xff] 对正则不熟的也许会觉得怎么不是 [0-9a-zA-Z_\x7f-\xff]其实 \w 就是 0-9a-zA-Z_
也许有人会说 $$a; ${$a}; 这样的变量呢
我觉得这个已脱离了变量命名的范围了不是么。
好了关于 php 变量可用字符的知识点分享完毕了如果有哪说的不对的请留言我会及时改正以免误导大家。
浅谈 PHP 变量可用字符
时间: 2024-10-26 05:46:49
浅谈 PHP 变量可用字符的相关文章
神盾加密解密教程(一)PHP变量可用字符_php技巧
先来说说php变量的命名规则百度下一抓一大把(1) PHP的变量名区分大小写;(2) 变量名必须以美元符号$开始;(3) 变量名开头可以以下划线开始;(4) 变量名不能以数字字符开头. 其实所有编程都类似的命名规范就是1. 变量第一个字符最好是 字母或_不能以数字开头2. 第二个字符开始允许 数字字母_ 好了差不多就是这样了但是这不是我们要说的重点.今天我们说说 PHP 变量的可用字符不仅仅是 数字字母_ 哦. 前几天QQ上一朋友发我一个shell是加密过的通篇乱码不过上面有注释叫做 "神盾加密
浅谈JavaScript中的字符编码转换问题_基础知识
要获得字符的Unicode编码,可以使用string.charCodeAt(index)方法,其定义为: strObj.charCodeAt(index) index为指定字符在strObj对象中的位置(基于0的索引),返回值为0与65535之间的16位整数.例如: var strObj = "ABCDEFG"; var code = strObj.charCodeAt(2); // Unicode value of character 'C' is 67
浅谈PHP变量作用域以及地址引用问题
这篇文章主要介绍了PHP变量作用域以及地址引用问题,有需要的朋友可以参考一下 作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域. 主要的常用的包括:局部变量.全局变量.静态变量. 1.局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快.仅在函数内有效. 2.全局变量:与局部变量相反,全局变量可以在程序的任何地方访问.只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量.在
浅谈Java变量的初始化顺序详解_java
规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器证明代码: 复制代码 代码如下: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量"; // 变量 public String field = "变量"; // 静
浅谈const变量赋值报错分析_C 语言
从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会报错: 复制代码 代码如下: error: invalid conversion from `char**' to `const char**' 示例: int main(int argc, char *argv[]) { char a = '1'; const char b = a; char * a2 = "12345"; const
浅谈静态变量、成员变量、局部变量三者的区别_java
静态变量和成员变量的区别: A:所属不同 静态变量:属于类,类变量 成员变量:属于对象,对象变量,实例变量 B:内存位置不同 静态变量:方法区的静态区 成员变量:堆内存 C:生命周期不同 静态变量:静态变量是随着类的加载而加载,随着类的消失而消失 成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失 D:调用不同 静态变量:可以通过对象名调用,也可以通过类名调用 成员变量:只能通过对象名调用 成员变量和局部变量的区别: A:在类中的位置不同 成员变量:
浅谈Javascript变量作用域问题_javascript技巧
Js中的变量作用域问题: 1.没有块级作用域.Js中的变量作用域不是以{}为界的,不像C/C++/Java. 如: 复制代码 代码如下: if(true){ var name = "qqyumidi"; } alert(name); // 结果:qqyumidi Js会将在if中定义的变量添加到当前的执行环境中,尤其在使用for循环时需要注意与其他语言的差异. 复制代码 代码如下: for(var i=0; i<10; i++){
浅谈JavaScript变量的自动转换和语句_javascript技巧
JS自动类型转换 var a = 1; var b = true; "==" 表示 可以自动类型转换,比较的是数值 "===" 表示可以自动类型转换,先比较数值,再比较类型 if (a == b) { alert("相等"); //打印 }else{ alert("不等"); } 三目运算 var c = 10/2 > 4 ? 5 : 3 ; alert(c); 关于for循环 for ( var i = 0; i &
浅谈 PHP 神盾的解密过程
原文:浅谈 PHP 神盾的解密过程 前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 "神盾加密" , 牛逼闪闪的样子.百度下发现神盾是个很古老的东西,最后一次更新是在 2012-10-09.和他相似的另一款是phpjm,有人说是神盾抄袭phpjm的,这些都不是我们所要关心的问题.phpjm一直在更新,而神盾貌似不搞了,我们分析下神盾,顺便写成工具,方便大家使用(因为他不更新,所以就不用担心解密工具失效问题了).其实网上早就有人分析过这个了,而且写成了工具.但是