В Google App Engine есть белый класс класса JRE.
Мне бы очень понравился "Черный список" - другими словами, Java API, которые не будут работать с GAE. Существует ли такой список? У каких-либо разработчиков возникают проблемы с Java API на GAE?
В Google App Engine есть белый класс класса JRE.
Мне бы очень понравился "Черный список" - другими словами, Java API, которые не будут работать с GAE. Существует ли такой список? У каких-либо разработчиков возникают проблемы с Java API на GAE?
Похоже, что они взяли более белый подход: http://code.google.com/appengine/docs/java/jrewhitelist.html.
Здесь также есть более подробная информация о песочнице (какие файлы она может получить и так далее): http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox
Ограничения кажутся довольно интуитивными (например, ограниченный доступ к файловой системе, JNI и т.д.).
Я не знаю черный список, но может оказаться полезной следующая ссылка: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine
Я получил карту, рекламирующую эту услугу в Google I/O:
Анализатор совместимости LTech AppEngine
Похоже, он вам может пригодиться. Я не пробовал, если вы попробуете, пожалуйста, вернитесь и прокомментируйте. Спасибо!
Я использую Servlet в моем проекте GAE, однако он не находится в белом списке, даже когда он будет работать без каких-либо проблем. Фактически, Google упоминает, как использовать сервлет, но он не находится в белом списке
импортировать javax.servlet.http. *;
Упоминается здесь:
http://code.google.com/appengine/docs/java/runtime.html
но здесь не включен:
http://code.google.com/appengine/docs/java/jrewhitelist.html
Я люблю GAE (потому что свободная квота), но документация - беспорядок.
Я использую IntelliJ, и он отмечается как ошибка, когда импорт не включен в белый список. Однако его можно отключить.
Я искал что-то, когда я наткнулся на этот запрос, и поэтому решил поделиться деталями в черно-белом списке GAE (Google App Engine), чтобы любой, кто получил такую проблему, мог правильно его решить. Подробности: -
appengine-agentruntime.jar имеет две переменные экземпляра: -
private static Agent agent
private static Set<String> blackList
Мы получаем blackList от агента и агента = AppEngineDevAgent.getAgent()
. Поэтому, если мы проверим b) appengine-agent.jar, мы можем найти агента Class<?> implClass = agentImplLoader.loadClass("com.google.appengine.tools.development.agent.impl.AgentImpl");
И затем, перейдя в класс AgentImpl i.e. c) appengine-agentimpl.jar, мы можем см. переменную blacklist, заполняемую при загрузке класса статической инициализацией, и она ссылается на белый список для фильтрации разрешенных классов.
static {
initBlackList();
}
public static Set<String> getBlackList() {
return blackList;
}
private static boolean isBlackListed(String className) {
Set<String> whiteList = WhiteList.getWhiteList();
return (!whiteList.contains(className))
&& (!className.startsWith("com.sun.xml.internal.bind."));
}
Наконец, можно проверить d) appengine-tools-sdk-1.8.3.jar для списка всех классов WhiteList.
Вывод: Как взломать, чтобы использовать любой класс JRE, который не принадлежит этому WhiteList, нужно играть с WhiteList или с BlackList. Возможный взлом - если вы разделите библиотеку appengine-agentruntime.jar и прокомментируете содержание метода отклонения как
public static void reject(String className) {
/*throw new NoClassDefFoundError(className + " is a restricted class. Please see the Google " + " App Engine developer guide for more details.");*/
}
И снова запустите его и используйте в своем проекте. Надеюсь, это поможет.
a) appengine-agentruntime.jar: - Он содержит фактический класс Runtime, который генерирует исключение (из метода отклонить) для классов, которые не принадлежат к указанному выше белым спискам.
package com.google.appengine.tools.development.agent.runtime;
import com.google.appengine.tools.development.agent.AppEngineDevAgent;
import com.google.appengine.tools.development.agent.impl.Agent;
import com.google.apphosting.utils.clearcast.ClearCast;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT
public class Runtime {
private static Agent agent = (Agent) ClearCast.cast(
AppEngineDevAgent.getAgent(), Agent.class);
private static Set<String> blackList = agent.getBlackList();
public static ClassLoader checkParentClassLoader(ClassLoader loader) {
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
return (loader != null) && (loader != systemLoader) ? loader
: Runtime.class.getClassLoader();
}
public static void recordClassLoader(ClassLoader loader) {
agent.recordAppClassLoader(loader);
}
public static void reject(String className) {
throw new NoClassDefFoundError(className
+ " is a restricted class. Please see the Google "
+ " App Engine developer guide for more details.");
}
private static boolean isBlackListed(Class klass) {
String className = klass.getName().replace('.', '/');
return blackList.contains(className);
}
// REMOVED OTHER METHODS TO KEEP IT SHORT
}
b) appengine-agent.jar: -
package com.google.appengine.tools.development.agent;
import com.google.apphosting.utils.clearcast.ClearCast;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT
public class AppEngineDevAgent {
private static final String AGENT_IMPL = "com.google.appengine.tools.development.agent.impl.AgentImpl";
private static final String AGENT_IMPL_JAR = "appengine-agentimpl.jar";
private static final Logger logger = Logger.getLogger(AppEngineDevAgent.class.getName());
private static Object impl;
public static void premain(String agentArgs, Instrumentation inst) {
URL agentImplLib = findAgentImplLib();
URLClassLoader agentImplLoader = new URLClassLoader(
new URL[] { agentImplLib }) {
protected PermissionCollection getPermissions(CodeSource codesource) {
PermissionCollection perms = super.getPermissions(codesource);
perms.add(new AllPermission());
return perms;
}
};
try {
Class<?> implClass = agentImplLoader
.loadClass("com.google.appengine.tools.development.agent.impl.AgentImpl");
impl = ((AgentImplStruct) ClearCast.staticCast(implClass,
AgentImplStruct.class)).getInstance();
AgentImplStruct agentImplStruct = (AgentImplStruct) ClearCast.cast(
impl, AgentImplStruct.class);
agentImplStruct.run(inst);
} catch (Exception e) {
logger.log(
Level.SEVERE,
"Unable to load the App Engine dev agent. Security restrictions will not be completely emulated.",
e);
}
}
public static Object getAgent() {
return impl;
}
//REMOVED OTHER METHODS TO KEEP IT SHORT
}
c) appengine-agentimpl.jar: -
package com.google.appengine.tools.development.agent.impl;
import com.google.apphosting.runtime.security.WhiteList;
//REMOVED OTHER IMPORTS TO KEEP IT SHORT
public class BlackList {
private static final Logger logger = Logger.getLogger(BlackList.class.getName());
private static Set<String> blackList = new HashSet();
static {
initBlackList();
}
public static Set<String> getBlackList() {
return blackList;
}
private static boolean isBlackListed(String className) {
Set<String> whiteList = WhiteList.getWhiteList();
return (!whiteList.contains(className))
&& (!className.startsWith("com.sun.xml.internal.bind."));
}
private static void initBlackList() {
Set<File> jreJars = getCurrentJreJars();
for (File f : jreJars) {
JarFile jarFile = null;
try {
jarFile = new JarFile(f);
} catch (IOException e) {
logger.log(
Level.SEVERE,
"Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. "
+ f.getAbsolutePath());
}
continue;
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(".class")) {
String className = entryName.replace('/', '.').substring(0,
entryName.length() - ".class".length());
if (isBlackListed(className)) {
blackList.add(className.replace('.', '/'));
}
}
}
}
blackList = Collections.unmodifiableSet(blackList);
}
private static Set<File> getCurrentJreJars() {
return getJreJars(System.getProperty("java.home"));
}
//REMOVED OTHER METHODS TO KEEP IT SHORT
}
d) appengine-tools-sdk-1.8.3.jar: - У него есть класс под названием WhiteList, который включает все допустимые классы JRE.
package com.google.apphosting.runtime.security;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class WhiteList {
private static Set<String> whiteList = new HashSet(
Arrays.asList(new String[] {
"java.beans.Transient",
"java.lang.BootstrapMethodError",
"java.lang.Character$UnicodeScript",
"java.lang.ClassValue",
"java.lang.SafeVarargs",
//Removed other classes to keep this article short
"java.net.URLClassLoader",
"java.security.SecureClassLoader",
"sun.net.spi.nameservice.NameService" }));
public static Set<String> getWhiteList() {
return whiteList;
}
}