Submitted by gouki on 2009, March 2, 3:59 PM
题前话:
其实以前也看到过类似的东西,但是我没有想到进用gzip之类的加密,看来,即使是见过的东西,也有不熟悉的。看到作者这样仔细的分析相类似的资料,当然要备份一点。
原文:http://www.zendstudio.net/js-zip-inflate/
AJAX还是比较强大的!(显然,这是一句废话),最近在研究一个网站的AJAX应用中发现其中的“拓展视野”部分频频被挖掘出来(也由此可见,平时本人 的视野有多么的狭窄了),首先是全站的JS全部使用packed进行了压缩,呃!也不知道这种称法是否正确,就是用 eval(function(p,a,c,k,e,d){})的那种世界各地都很流行的压缩方法吧,在实际的观察中,一个压缩后仅为6K,在我将其转化为 “肉眼能看清楚的代码”之后,足足有20K,可见其效果还是相当明显的;此外,用HttpWatch弄到了传输数据后,居然是加密的。。。形如下面这段:
XML/HTML代码
- q1YqT81MzyhRsqpWys3MU7Iy0FHKTaxQsjLWUUrLL8pNBMooqeoZpSnV6igVFGUmp2KoVDIzMrIwNdAzMFBC1pOiVFsLAA==
任何一个有些许密码学经验的同志都容易很看出来,这是base64编码(我实在不喜欢称这个为“加密”),没错,和各位看官一样,我很快就用php自带的base64_decode函数对其进行了解密,如果您觉得问题到此为止,那就错了!这时我才稍稍感到了有些震撼,解密出来的数据:
呃!一堆乱码,其实应该是二进制数据,加密了(后来知道是压缩了),可是用户是看不懂这些的,客户端是肯定要进行解密的!用什么?AJAX的当然用JS解密了,挖解密函数啊,挖解密函数,看到了如下的精彩代码:
JavaScript代码
- var filterList=eval('('+utf8to16(zip_depress(base64decode(g_pgFilterList)))+')');
utf8to16()和base64decode()都好理解,也再一次证明加密的最后是用base64编码输出的,关键就是这个zip_depress(),zip解压?
是的,千真万确,用JS实现了zip的解压算法!!!到这里我深深的感到了震撼,原来,我知道的真的太少了啊!虽然之前知晓有md5.js,知道JS在运算方面是没有问题的。不会是这家伙自己写的压缩算法吧?经过搜索,我找到了这个算法(Zip inflate)的原版,原来该网站的制作人员修改了函数名,难怪我直接google不到呢?
什么是inflate算法?—
- inflate是GZip, PNG等广泛使用的解压算法,linux也使用inflate对内核进行解压.inflate的解压算法使用的第3种快速解压法的一个子集,它不考虑 LONG_CODE,同时把SAME_LENGTH合并到MEDIUM_CODE。而对于规则的SAME_LENGTH编码,比如length和 distance编码,inflate则使用额外的base和extra表示。这是因为在构造一般的查找表时,虽然对于SAME_LENGTH前缀可以不构造副表,但我们需要另外一个表格来保存符号的顺序,而这个表格的空间可能更大。但对于length和distance编码,他们的顺序是递增的,所以无需额外的表格来保存符号的顺序。
-
- inflate使用root表示上述的b,查找表的数据结构为code.主表和副同时保存在inflate_state结构中的大数组codes[ENOUGH]中.表的构造函数位于inftrees.c文件的inflate_table中.
令人感到欣喜若狂的是,PHP竟然已经提供的现成函数来解压和压缩inflate,它们是gzinflate()和gzdeflate(),哈哈哈!我不禁仰天狂笑的一番,用gzinflate()成功的将上文数据解密,内容是这样的:
JavaScript代码
- {"weight":{"min":0,"max":3,"format":"%.2f"},"price":{"min":0,"max":"622850.00","format":"%d"}}
标准的JSON数据啦,不错!这就为以后的AJAX的传输上多了一个选择,虽然还不确定这种方法能否节省流量(因为base64算法会将原始数据“稍稍” 增大),但客户端有了解压算法,服务端的php压缩函数又是现成的,大不了在base64这个环节上大概需要改进下,我想对于大流量的数据应该还是有确切 效果的。嗯,我很满意。
————————
看完以上的内容,嗯,我也很满意,呵呵
Javascript | 评论:0
| 阅读:17013
Submitted by gouki on 2009, March 1, 10:17 PM
给自己提醒, 回忆未来张宴的网站上有一些例子不错,正好自己又装了虚拟机,看来是应该根据这些资料好好的学习一下了。这样也可以让自己更加熟悉linux下面的操作。
再次提醒自己
呵呵。不能忘了
Tags: 备忘, 回忆未来, 技术
Misc | 评论:0
| 阅读:15698
Submitted by gouki on 2009, February 28, 9:54 AM
目前我还是利用系统自带的apt来进行安装的,所以相对还是比较简单的:
apt-get install apache2.2-common apache2 php5-mysql mysql-server-5.0 mysql-client mysql-common
就可以直接安装了。安装过程中会有提示你设置MYSQL的密码,主要是指ROOT的。
如果是用新立得安装那就更简单了,只要根据你需要的模块进行安装就行了。(以前我都是这样搞的,但是这次是用的SERVER,没法直接用新立得)
顺便说一下,网易的源速度真的不错。
感谢网易在开源方面的贡献。谢谢
使用默认的apt-getp安装的时候,它的配置在/etc/apache2/apache2.conf里,而不是大家所熟知的httpd.conf,而virtualhost的配置是在/etc/apach2/site-enabled/目录里,里面有一个默认的000-default文件,这就是默认的webroot的配置,我们可以很清楚的看到,webroot被定义在/var/www目录下面
由于是使用 apt 进行的安装,所以对于PHP等的扩展,也必须使用 apt才行,否则你会感觉到很迷惘。
Tags: ubuntu, lamp
Linux | 评论:0
| 阅读:20770
Submitted by gouki on 2009, February 27, 9:13 PM
纯粹是记录吧。在使用 UBUNTU 的时候,如果是ubuntu desktop,那配置起来是相当简单的,就象windows那样配置就行了,但如果是ubuntu server,怎么配置呢?当然是用ifconfig了。
很简单的命令:
ifconfig eth0 192.168.1.2 broadcast 192.168.1.1 netmask 255.255.255.0
- eth0是代表第一块网卡,因此,如果你不确认的时候,必须要使用ifconfig查看一下有几块网卡,想配置的是不是eth0
- 192.168.1.2是想要配置的IP
- broadcast 192.168.1.1 代表了网关
- netmask 就是子网掩码了
这样配置完还是不能上网的,因为还没有配置DNS,然后 vi /etc/resolv.conf ,在文件里加入:nameserver 202.96.209.133 ,当然这是上海地区所使用的DNS,有常见的几条,统统加进来就行了。
最后在命令行下执行:/etc/init.d/networking start,对刚才的配置进行重新启动,激活一下网卡配置。
OK,就可以上网了。。
后来我又看了点资料,发现网上还是有详解的:
Tags: ubuntu, ifconfig, resolv
Linux | 评论:0
| 阅读:45943
Submitted by gouki on 2009, February 27, 10:55 AM
创建型模式
1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语 言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你” builder。(这一定比美军在伊拉克用的翻译机好卖)
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减 少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)
单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
……………………
» 阅读全文
Tags: 设计模式
PHP | 评论:0
| 阅读:18275