WEB开发网
开发学院软件开发Python 以Python为例讨论高级编程语言程序的wire format与... 阅读

以Python为例讨论高级编程语言程序的wire format与校验

 2010-09-22 11:26:23 来源:WEB开发网   
核心提示: 再次注意:为执行程序,传的是源码的话则无法避免对源码的解析(包含校验),以Python为例讨论高级编程语言程序的wire format与校验(7),但却并不一定要对中间代码校验, 如果对中间代码校验,而Python解释器在检查文件头通过之后就会毫不犹豫的加载和执行这文件,即使对应的源文件不

再次注意:为执行程序,传的是源码的话则无法避免对源码的解析(包含校验),但却并不一定要对中间代码校验。

如果对中间代码校验,则以源码为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的一种)。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:Python 讨论 高级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接