GAE相关
Google App Engine for Java是可以在Google托管服务器基础架构上托管和运行用户Web应用程序。出于安全原因,这些应用程序在沙盒环境中执行。
沙箱本身由两层组成。第一层是GAE Java沙箱,它建立在底层Java SE软件之上。第二层是本机OS沙箱,它限制了操作系统对用户应用程序和GAE环境本身的暴露。
标准Java SE安全沙箱以及GAE沙盒层的存在对GAE环境中执行的用户应用程序强制实施了若干限制。
默认情况下,用户应用程序无法访问基础本机OS的文件系统。用户代码只对其唯一的应用程序部署目录及其所有子目录具有只读访问权限。用户应用程序无法将任何数据写入文件系统。他们需要使用App Engine数据存储区API进行任何持久数据存储
网络套接字仅适用于GAE付费应用程序,只能创建出站,客户端(非监听)TCP或UDP套接字,不能绑定到特定地址或端口
用户应用程序是Web应用程序,因此它们通过Servlet API或JSP文件处理Web请求。用户代码通常在关联的HTTP请求时生成。 GAE确保在完成请求处理后终止与给定HTTP请求关联的所有线程。同时在处理HTTP请求后没有用户代码被执行。这其中包括各种系统Java处理程序和终结程序。虽然GAE中提供了对所谓的后台线程和cron任务的支持,但它们并未实现为经典后台Java线程。
大多数java.lang.System API不适用于用户应用程序。因此,用户代码无法隐式触发GC操作。但GAE使用户代码可以创建任意类加载器。因此,用户应用程序可以成功定义和创建java.lang.ClassLoader类的子类实例来实现自定义类的加载逻辑。类加载器可以为JVM提供类定义及其权限(保护域和权限)。GAE允许对应用程序自己的类(由应用程序类加载器或自定义的用户定义的类加载器定义的类)进行完全和不受限制的Reflection API访问。
为了最大限度地降低JRE中存在的安全漏洞带来的风险,GAE采用了JRE Class White List的概念。它的目标是限制用户代码可以访问的JRE类集。只有在环境中允许所请求的类时,任意类加载或链接才会成功(它存在于被视为安全JRE类的列表中的JRE类白名单)。
GAE Java Runtime沙箱在native和Java类级别实现。其依赖于两个通信通道来服务和处理特定的RPC请求。两个通道都是沙盒启动过程的一部分。native Java Runtime层依赖于C1通道。非原生层使用C2通道。
GAE Runtime实现了虚拟文件系统给任意文件访问,并再native层实现拦截与代理(LibcProxy和FDProxy组件)。通过GAE的代理库调用实现C1通信通道将它们分派给适当的RPC服务。
在GAE中,用户应用程序加载的所有类都需要在定义JVM中的给定类之前执行强制验证步骤(扫描)。扫描是通过UserClassLoader类的代码及其特定的findClass方法进行的。类扫描构成了GAE Java沙箱的基本安全机制。类加载器,反射API,JRE类白名单几个关键GAE安全概念的实现依赖于它。检查过程本身依赖于类文件的静态分析,使用ASM(Java字节码操作和分析框架)实现类扫描。如果给定的Class文件不满足GAE沙箱的某些安全要求(即无效的子类化),则类扫描可能引发异常。如果已完成,则输入的Class字节将被复制到输出流而不进行任何修改,或者根据特定规则进行转换。
GAE实现了一种允许任意修改或完全拦截JRE类的机制。 API注入机制使得在调用另一个方法之前调用给定方法成为可能。 API拦截允许调用给定方法来代替另一个方法。拦截API可以应用于方法,字段和构造函数。 Interjection API仅支持方法。 GAE Class Sweeper对检查类的代码应用适当的转换,以实现API插入和拦截功能。如果用户代码中引用的给定类具有镜像,则对它的每个引用都将替换为对该镜像的引用。类似地,在镜像类中具有相应实现(定义)的类的方法(字段)的实例调用被镜像方法(字段)的静态调用(访问操作)替换。 截至2014年10月,GAE针对160个JRE类实施了API拦截。 API Interjection仅针对4个类进行。
由于拦截机制,本地GAE环境难以完全复现Google的生产环境,在本地GAE环境中开发和测试的所有POC,在本地运行良好,但其中许多在生产环境中失败了。GAE存根类包含虚拟方法和初始化程序,除了在调用时抛出异常之外没有太多作用。
GAE Java运行时创建了几个Class Loader名称空间,它们在用户,运行时和系统代码之间提供了自然的隔离。用户应用程序代码加载始终由
com.google.apphosting.runtime.security.UserClassLoader类的实例处理。此类加载器也设置为当前Thread的上下文类加载器。 UserClassLoader命名空间始终是Class Sweeping的主题。这在类加载器级别为GAE沙箱层形成安全边界。UserClassLoader还依赖于两个额外的类加载器来进行类加载。
com.google.apphosting.runtime.security.RuntimeClassLoader类的实例用于加载GAE Java Runtime实现类。还有一个PrivilegedClassLoader类的实例,它是UserClassLoader的一个内部类。它处理实现Class Sweeper的API Interjection和Interception层的类(所有拦截/插入的类定义)。
GAE相关的更多相关文章
- 把我的漫画浏览器后台程序迁移到GAE上了
这两天看了一下Python和GAE相关资料,作为练手,把我以前写的Windows 8下看漫画的程序的后台解析算法迁移到了GAE上了. 之前由于没有后台服务器,很多东西在本地实现起来不是很方便,现在拿G ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛
GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛 :GAE+bottle+jinja2+beaker快速开发 ...
- PaaS 调研:GAE与 AWS(上)
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:韩伟 起因 PaaS作为"云"的概念,已经流行了很久.从使用的角度上看,似乎就是:写一个PHP,然后可以直接传到服务 ...
- Java 开源博客 Solo 1.1.0 发布 - 告别 GAE
Solo 1.1.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们对项目结构和发布包进行了重大调整: 各式***尚未普及,所以决定去除 GAE 版本 H2 版本使用人数较 ...
- 变分(图)自编码器不能直接应用于下游任务(GAE, VGAE, AE, VAE and SAE)
自编码器是无监督学习领域中一个非常重要的工具.最近由于图神经网络的兴起,图自编码器得到了广泛的关注.笔者最近在做相关的工作,对科研工作中经常遇到的:自编码器(AE),变分自编码器(VAE),图 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- SQL Server相关书籍
SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
随机推荐
- Bcrypt.check_pass/3 用法
defmodule My do defstruct password: "", apassword_hash: "", aencrypted_password: ...
- 【电商日志项目之六】数据分析-Hive方式
环境 hadoop-2.6.5 hive-1.2.1 一.Hive和Hbase整合如果使用Hive进行分析,Hive要从Hbase取数据(当然可以直接将数据存到Hive),那么就需要将Hive和HBa ...
- 栈习题(1)-对于任意的无符号的的十进制数m,写出将其转换为十六进制整数的算法(正确输出即可)
/*对于任意的无符号的的十进制数m,写出将其转换为十六进制整数的算法(正确输出即可)*/ /* 算法思想:利用辗转取余法,每次都将余数存入栈中,直到被除数等0,退出循环. 输出栈里的内容即可 */ v ...
- Python-13-模块和包
一.模块的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代 ...
- SQL——WHERE子句
一.WHERE字句的基本用法 WHERE字句用于筛选数据,提取满足条件的记录. WHERE字句的基本用法: SELECT * from 表名 WHERE 条件语句; 二.WHERE字句与删改查 演示s ...
- 通过Anaconda安装的jupyter notebook,打开时,未能启动默认浏览器
问题:通过Anaconda安装的jupyter notebook,通过开始菜单的快捷方式打开时,未能启动网页,需要复制url,粘贴到浏览器中才会出现工作面板. 解决方法: 修改jupyter_note ...
- Mac上go的下载安装教程
mac上go的下载安装教程 官网https://golang.google.cn/dl/下载,安装 环境变量配置 参考https://www.jianshu.com/p/5c1873eaf3ca Ba ...
- Shiro集成SSM基于动态URL权限管理(二)
这个案例基于上一个demo扩展而来.所以数据库表,在Shiro集成SSM基于URL权限管理(一)开篇的一致.如果上个demo操作的建议重新导入一次,避免出现问题. 而这次都不是通过固定写在方法上的注解 ...
- 使用PHP开发HR系统(6)
本节讲述如何连接Postgre数据库并查询与显示数据. ==================================================================== ...
- Qt 中的二进制兼容策略(简而言之就是地址不能变,剩下的就是让地址不变的技巧)
本文翻译自 Policies/Binary Compatibility Issues With C++ 二进制兼容的定义 如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要 ...