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相关的更多相关文章

  1. 把我的漫画浏览器后台程序迁移到GAE上了

    这两天看了一下Python和GAE相关资料,作为练手,把我以前写的Windows 8下看漫画的程序的后台解析算法迁移到了GAE上了. 之前由于没有后台服务器,很多东西在本地实现起来不是很方便,现在拿G ...

  2. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  3. GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛

    GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛     :GAE+bottle+jinja2+beaker快速开发 ...

  4. PaaS 调研:GAE与 AWS(上)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:韩伟 起因 PaaS作为"云"的概念,已经流行了很久.从使用的角度上看,似乎就是:写一个PHP,然后可以直接传到服务 ...

  5. Java 开源博客 Solo 1.1.0 发布 - 告别 GAE

    Solo 1.1.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们对项目结构和发布包进行了重大调整: 各式***尚未普及,所以决定去除 GAE 版本 H2 版本使用人数较 ...

  6. 变分(图)自编码器不能直接应用于下游任务(GAE, VGAE, AE, VAE and SAE)

        自编码器是无监督学习领域中一个非常重要的工具.最近由于图神经网络的兴起,图自编码器得到了广泛的关注.笔者最近在做相关的工作,对科研工作中经常遇到的:自编码器(AE),变分自编码器(VAE),图 ...

  7. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  8. SQL Server相关书籍

    SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...

  9. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

随机推荐

  1. GSON工具类

    import java.util.Map; import com.google.gson.reflect.TypeToken; import com.google.gson.FieldNamingPo ...

  2. 基于Emit的C#下DataTable转实体类方法,一直报错.

    xxxx ;WITH Tab AS ( SELECT CAST(ROW_NUMBER()OVER(ORDER BY CC.CreateTime DESC) AS INT) AS Sequency, ) ...

  3. 应用程序正常初始化(0xc0000135)失败。请单击“确定”,终止应用程序。

    应用程序正常初始化(0xc0000135)失败.请单击“确定”,终止应用程序. 没有安装对应版本的.NET FRAMEWORK.

  4. java内存泄露/溢出等常见问题模拟及原因分析

    Java 8:从持久代到metaspace 系统稳定性--OutOfMemoryError 常见原因及解决方法 java各种异常问题示例(附pdf下载): java.lang.OutOfMemoryE ...

  5. linux中安装cx_Oracle

    https://blog.csdn.net/w657395940/article/details/41144225 各种尝试都,最后 pip install cx-Oracle 成功导入

  6. ajax中参数traditional的作用

    在使用ajax向后台传值的时候,有的时 $.ajax({ type: "post", async: true, data: { "records": [&quo ...

  7. spring security实现记住我下次自动登录功能

    目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...

  8. 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面

    面试题 21. 调整数组顺序使奇数位于偶数前面

  9. Worker Thread模式

    工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来 5个工人线程从传送带取数据,3个传送工人线程将数据放入传送带 public class C ...

  10. [IOT] - Raspbian Buster 设置固定 IP

    背景 Raspberry Pi 4 + Raspbian Buster 配置步骤 1. 打开文件 "/etc/dhcpcd.conf" 进行配置. 2. 有线网卡配置固定IP in ...