重拾Java(四)

06-9-19:
安全实现:
比如在C或者C++中,利用任意的类型转换何指针的算法,我们可以很容易的突破类的封装,访问到类中的关键域。但是这个是不可能发生在Java中的。如果这些类是你的运行时环境,你可能就会觉得这是多么的重要。如果这些不可信赖的代码能够破坏到组件,比如访问你的真正的资源的组件,那么你的信用卡密码就会有可能被偷窃。

如果一个Java程序能够动态的下载代码在Internet上,然后运行在你的机密程序的旁边,保护不得不延伸得很深。Java安全模型在导入得类上封装了三层保护。在最外层,一个叫做安全管理的程序级的安全决策与一个灵活的安全策略连接。一个安全管理控制着对系统资源的访问。安全管理依靠类加载器来保护基本的系统类。一个类加载器处理加载从本地到网络的类。在最里层,所有的系统安全最终取决于Java验证器,保证来自类的完整性。(这个地方没有搞懂)

Java字节码验证器是Java运行时系统的固定部分。类加载器和安全管理程序不同可能实现不同,比如applet查看器和Web浏览器。所有的这三个部分(包括验证器、类加载器和安全管理)都需要各尽其能,才能保证Java环境的安全性。

验证器:Java的第一道防线是字节码验证器。这个验证器读取字节码,保证它有良好的行为,遵守Java语言的基本规则。一旦验证完成,就被认为是安全的,对于那些无意的或者恶意的错误。比如,验证的代码不能够伪造引用或者非法访问一个对象。它也不能执行非法的类型转换或者用无意的方法使用对象。甚至不能导致某些内部错误,比如操作数栈的溢出或者下溢。这些基础的保证位于所有的Java安全之下。

你可能比较的疑惑,这些安全不是在许多的解释型语言中实现了吗?记住这些解释型语言的保护是高层次的,然而,你不应该能够伪造一个Basic代码来破坏解释器。这些语言很有可能有一个重量级的解释器做许多的运行时工作,所以他们更加的缓慢和笨拙。

相反,Java字节码是相对轻量级的,低层次指令集。在执行前验证Java代码的能力,使得Java解释器完全高速的运行且安全,没有花费在运行时检查。这就是Java的新的地方。

这个验证器就是一种数学上的“验证定理”。它一步一步的扫描Java字节码,然后应用样本,感应规则来决定Java字节码的怎样工作的某些方面。这种分析是可能的,因为编译了的Java字节码包含了更多的信息。字节码也不得不遵守许多额外的规则来简化它的行为。首先,大多数的字节码指令操作个别的数据类型。比如栈操作,对于对象的引用有分离的指令,在Java中分别是枚举类型。相应的,也有不同的指令来移动每种类型的值到和出局部变量。

第二,对象的类型总是提前被知道。没有字节码操作能够销毁值和产生不可能产生的值作为输出。结果,总是有可能发现下一条指令和它的操作数,知道将会产生的值的类型。

因为一个操作总是产生一个知道的类型,通过查看开始的状态,总是有可能决定栈上所有的item的类型,之后局部变量在哪一点。在任何时间内的所有的类型信息集合叫做类型状态栈;这是Java试图去分析的在程序运行之前。Java不知道栈种的真实值和变量,而仅仅知道item的类型。然而,这些信息足够来加强安全规则,保证对象不会被非法的操作。

为了保证分析类型状态栈的可能性,Java放置了一个额外的限制关于Java字节码指令被执行之前:在代码中所有到相同点的路径不得不准确地到达同样的类型状态。

类加载器:负责把字节码调入解释器。类被有效的分割成不同的命名空间中。当一个加载了的类引用了另外一个类名的时候,源类加载器就会提供新的类的位置。这就意味着从一个特殊的源检索出来的类能够被限制的与从同样位置检索出来的其他的类交互。比如,一个支持Java的浏览器,能够使用一个类加载器来构建一个为所有的来自URL的加载的类提供一个分离的空间。完善的基于密码的签名的类也能够使用类加载器实现。

对于Java类的搜索总是开始于内建的Java系统类。从表明的Java解释器classpath中加载这些类。classpath中的类只加载一次,且不能够被替换。这就意味着,对于一个applet,不可能替换基本的系统类用它自己的版本,来改变他们的功能。

安全管理:负责应用层安全决策。限制对系统资源的访问的对象。比如支持Java的浏览器能够运行不受信的网络的源applets。这个浏览器的第一个动作就是下载安全管理。

在最新的Java中,安全管理与访问控制配合使用,使得你可以通过编辑安全策略文件,在一个高层次实现安全策略。

Java验证器保证了解释器不会被破坏和搅乱。类加载器保证程序使用核心Java系统类。

应用和用户层安全:
有些安全问题和用户的应用问题,我们不得不考虑。在一些解决方案中,通过询问客户okay,来决定是否进行限制。

类签名:电子签名与证书。

Java和Web:
简单得介绍了Java在Web上面得潜力。然后说了Java Web Start允许你得浏览器安全的安装软件。

为了可视化的开发环境工作得更好,你需要能够创建可复用得软件组件。那就是JavaBeans:它定义了一个方式来把软件打包,成为可服用的组装块。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CGI(Common Gateway Interface)是一种标准,用于在Web服务器上运行外部程序。 CGI程序可以与Web服务器进行通信,从而让Web服务器获取外部程序生成的数据,并将其返回给客户端浏览器。在这个过程中,CGI程序可以读写文件、处理表单数据、查询数据库等。 文件上传是Web应用程序中非常常见的一种功能。上传文件的过程涉及到客户端浏览器将文件数据发送到Web服务器,Web服务器将文件保存到指定的目录中,并将文件相关的信息存储到数据库中。CGI程序可以处理上传文件的请求,并实现文件的保存和数据库的更新等操作。 cgicc是一个C++库,用于处理CGI程序中的表单数据。它提供了一组简单易用的API,可以方便地读取和处理表单数据,并且支持文件上传等功能。使用cgicc可以极大地简化CGI程序的开发。 下面是一个使用cgicc处理文件上传的示例: ```cpp #include <iostream> #include <fstream> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main() { Cgicc cgi; const_file_iterator file = cgi.getFile("file"); if(file != cgi.getFiles().end()) { string filename = file->getName(); string filepath = "/var/www/upload/" + filename; ofstream ofs(filepath.c_str(), ios::out | ios::binary); file->writeToStream(ofs); ofs.close(); cout << HTTPHTMLHeader() << endl; cout << HTMLDoctype(HTMLDoctype::eStrict) << endl; cout << html().set("lang", "en").set("dir", "ltr") << endl; cout << head() << title("File Upload Result") << head() << endl; cout << body() << h1("File Upload Result") << endl; cout << p("File " + filename + " uploaded successfully!") << endl; cout << body() << html(); } else { cout << HTTPHTMLHeader() << endl; cout << HTMLDoctype(HTMLDoctype::eStrict) << endl; cout << html().set("lang", "en").set("dir", "ltr") << endl; cout << head() << title("File Upload Result") << head() << endl; cout << body() << h1("File Upload Result") << endl; cout << p("No file uploaded!") << endl; cout << body() << html(); } return 0; } ``` 在这个示例中,我们使用cgicc库处理表单数据,并通过getFile函数获取上传的文件。如果getFile返回的迭代器不等于getFiles返回的迭代器末尾,说明有文件上传。我们可以通过getName获取上传文件的名称,并指定文件保存的路径。然后,我们使用writeToStream将文件写入到指定的文件路径中。 最后,我们输出一个HTML响应,显示文件上传的结果。如果有文件上传成功,输出“File uploaded successfully!”,否则输出“No file uploaded!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值