安全
自动下载和通过因特网运行程序听起来就象是一个病毒制造者的梦想。在客户端的编程中,ActiveX带来了 最让人头痛的安全问题。点击一个 Web站点的时候,可能会随同HTML 网页传回任何数量的东西:GIF 文件、 脚本代码、编译好的Java 代码以及ActiveX 组件。有些是无害的;GIF文件不会对我们造成任何危害,而脚 本编制语言通常在自己可做的事情上有着很大的限制。Java 也设计成在一个安全“沙箱”里在它的程序片中 运行,这样可防止操作位于沙箱以外的磁盘或者内存区域。 ActiveX是所有这些里面最让人担心的。用 ActiveX编写程序就象编制 Windows应用程序——可以做自己想 做的任何事情。下载回一个ActiveX组件后,它完全可能对我们磁盘上的文件造成破坏。当然,对那些下载 回来并不限于在Web浏览器内部运行的程序,它们同样也可能破坏我们的系统。从 BBS下载回来的病毒一直 是个大问题,但因特网的速度使得这个问题变得更加复杂。 目前解决的办法是“数字签名”,代码会得到权威机构的验证,显示出它的作者是谁。这一机制的基础是认 为病毒之所以会传播,是由于它的编制者匿名的缘故。所以假如去掉了匿名的因素,所有设计者都不得不为 它们的行为负责。这似乎是一个很好的主意,因为它使程序显得更加正规。但我对它能消除恶意因素持怀疑 态度,因为假如一个程序便含有Bug,那么同样会造成问题。 Java 通过“沙箱”来防止这些问题的发生。Java 解释器内嵌于我们本地的Web 浏览器中,在程序片装载时会 检查所有有嫌疑的指令。特别地,程序片根本没有权力将文件写进磁盘,或者删除文件(这是病毒最喜欢做 的事情之一)。我们通常认为程序片是安全的。而且由于安全对于营建一套可靠的客户机/服务器系统至关 重要,所以会给病毒留下漏洞的所有错误都能很快得到修复(浏览器软件实际需要强行遵守这些安全规则; 而有些浏览器则允许我们选择不同的安全级别,防止对系统不同程度的访问)。 大家或许会怀疑这种限制是否会妨碍我们将文件写到本地磁盘。比如,我们有时需要构建一个本地数据库,
41
或将数据保存下来,以便日后离线使用。最早的版本似乎每个人都能在线做任何敏感的事情,但这很快就变 得非常不现实(尽管低价“互联网工具”有一天可能会满足大多数用户的需要)。解决的方案是“签了名的 程序片”,它用公共密钥加密算法验证程序片确实来自它所声称的地方。当然在通过验证后,签了名的一个 程序片仍然可以开始清除你的磁盘。但从理论上说,既然现在能够找到创建人“算帐”,他们一般不会干这 种蠢事。Java 1.1 为数字签名提供了一个框架,在必要时,可让一个程序片“走”到沙箱的外面来。 数字签名遗漏了一个重要的问题,那就是人们在因特网上移动的速度。如下载回一个错误百出的程序,而它 很不幸地真的干了某些蠢事,需要多久的时间才能发觉这一点呢?这也许是几天,也可能几周之后。发现了 之后,又如何追踪当初肇事的程序呢(以及它当时的责任有多大)?
1 package Com.TomTest; 2 3 4 interface Computable { 5 int MAX=100; 6 int f(int x); 7 } 8 class China implements Computable { 9 int number; 10 public int f(int x) { //不要忘记public关键字 11 int sum=0; 12 for(int i=1;i<=x;i++) { 13 sum=sum+i; 14 } 15 return sum; 16 } 17 } 18 class Japan implements Computable { 19 int number; 20 public int f(int x) { 21 return 44+x; 22 } 23 } 24 public class TomTest_31 { 25 public static void main(String args[]){ 26 China zhang; 27 Japan henlu; 28 zhang=new China(); 29 henlu=new Japan(); 30 zhang.number=991898+Computable.MAX; 31 henlu.number=941448+Computable.MAX; 32 System.out.println("number:"+zhang.number+"求和"+zhang.f(100)); 33 System.out.println("number:"+henlu.number+"求和"+henlu.f(100)); 34 } 35 }