以Python为例讨论高级编程语言程序的wire format与校验
2010-09-22 11:26:23 来源:WEB开发网再次注意:为执行程序,传的是源码的话则无法避免对源码的解析(包含校验),但却并不一定要对中间代码校验。
如果对中间代码校验,则以源码为wire format时的执行过程会包括:
源码->(解析并校验源码,生成中间代码)->中间代码->(校验中间代码)->(执行)
这个过程包括了两次校验,安全性足够了但显得冗余。Lars Bak在访问中提到的“you'll have to check twice”指的就是这个。他尖锐的指出:因为JavaScript的wire format就是源码,所以没必要专门维护一种中间代码;更没必要以中间代码为wire format,否则就要校验两次。(注意前提是源码已经是wire format了)
如果不对中间代码校验,则以中间代码为wire format时的执行过程会包括:
中间代码->(执行)
什么?一次校验也没有了!这不就糟糕了么……
Python正好属于后一种情况。下面就以Python 2.6.2为例来演示不校验中间代码可能带来的后果。
实例部分
Python有两种封装中间代码的wire format,这里就以.pyc为例来讨论。
Python 2.6.2的.pyc文件格式请点击链接查看。本文关注的重点是校验问题,所以把文件格式分析剥离为单独一帖了。
从Python/import.c可以看到,Python在加载.pyc文件时会检查pyc_magic和mtime,以期拒绝掉格式不正确、或Python版本不对应、或对应源文件有更新的.pyc文件。显然这样只能防住君子,却防不了.pyc文件中字节码的“意外破损”“人为修改”。
可以把一个.pyc文件拿过来,任意修改其中的字节码,而Python解释器在检查文件头通过之后就会毫不犹豫的加载和执行这文件。即使对应的源文件不在旁边,Python解释器也不会抱怨(.pyc文件确实是wire format的一种)。
更多精彩
赞助商链接