神盾加密解密教程(一)PHP变量可用字符

 更新时间:2014年5月31日 01:00  点击:371

先来说说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 变量可用字符的知识点分享完毕了,如果有哪说的不对的,请留言,我会及时改正以免误导大家。

我的猜测: ascii 范围 0-127(/x00-/x7f), latin1 范围 0-255(/x00-/xff),也许PHP就是将范围扩充到 latin1 字符集了,当然我没看过PHP源码,只能说是个猜想而已。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • vue接口请求加密实例

    这篇文章主要介绍了vue接口请求加密实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • AES加密解密的例子小结

    关于AES加密的算法我们就不说了,这里主要给各位演示了三个关于AES算法实现的加密例子,希望本文章能给你带来帮助。 话不多说,先放上代码,一共有两个文件:AES.php(aes算...2016-11-25
  • node.JS md5加密中文与php结果不一致怎么办

    这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • NODE.JS加密模块CRYPTO常用方法介绍

    使用require('crypto')调用加密模块。加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher...2014-06-07
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • C# 获取硬盘号,CPU信息,加密解密技术的步骤

    这篇文章主要介绍了C# 获取硬盘号,CPU信息,加密解密技术的步骤,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16
  • C#实现对文件进行加密解密的方法

    这篇文章主要介绍了C#实现对文件进行加密解密的方法,涉及C#加密与解密的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php使用异或实现的加解密的方法

    若a=b ^ c;则b=a ^ c (^是异或的意思),php在处理异或的字符时先把字符转化为二进制的ascii值,对这些值进行异或,获取结果后在将ascii值转化为字符...2013-09-26