নিজের থ্রেডে অবিশ্বস্ত কোড চালান Run উদাহরণস্বরূপ এটি অসীম লুপগুলি এবং এ জাতীয় সমস্যাগুলি প্রতিরোধ করে এবং ভবিষ্যতের পদক্ষেপগুলি আরও সহজ করে তোলে। মূল থ্রেডটি থ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করুন এবং যদি খুব বেশি সময় লাগে তবে এটি থ্রেড.স্টপ দিয়ে হত্যা করুন। থ্রেড.স্টপকে অবমূল্যায়ন করা হয়েছে, তবে যেহেতু অবিশ্বস্ত কোডটির কোনও সংস্থান ব্যবহারের অ্যাক্সেস থাকা উচিত নয়, এটি এটি হত্যা করা নিরাপদ।
সেই থ্রেডে সিকিউরিটি ম্যানেজার সেট করুন । সিকিউরিটি ম্যানেজারের একটি সাবক্লাস তৈরি করুন যা কয়েকটি বাছাই করা ব্যতীত সমস্ত অনুমতিগুলির জন্য সিকিউরিটিএক্সসেপশন কেবল ছুঁড়ে ফেলতে চেকপিরমিশন (পার্মিশন পারমি) ওভাররাইড করে। তাদের এখানে প্রয়োজনীয় পদ্ধতি এবং অনুমতিগুলির একটি তালিকা রয়েছে: জাভা টিএম 6 এসডিকে অনুমতি ।
অবিশ্বস্ত কোড লোড করতে একটি কাস্টম ClassLoader ব্যবহার করুন। অবিশ্বস্ত কোড ব্যবহার করে এমন সমস্ত ক্লাসের জন্য আপনার ক্লাস লোডারকে ডাকা হবে, যাতে আপনি পৃথক জেডিকে ক্লাসে অ্যাক্সেস অক্ষম করার মতো কাজ করতে পারেন। করণীয় হ'ল অনুমোদিত জেডিকে ক্লাসগুলির একটি সাদা তালিকা রয়েছে।
আপনি অবিশ্বস্ত কোডটি আলাদা জেভিএমে চালাতে চাইতে পারেন। পূর্ববর্তী পদক্ষেপগুলি কোডটি সুরক্ষিত করে তুলবে, বিচ্ছিন্ন কোডটি এখনও করতে পারে এমন একটি বিরক্তিকর জিনিস রয়েছে: যতটা সম্ভব মেমরি বরাদ্দ করুন, যার ফলে মূল অ্যাপ্লিকেশনটির দৃশ্যমান পদচিহ্ন বৃদ্ধি পেতে পারে।
জেএসআর 121: অ্যাপ্লিকেশন আইসোলেশন এপিআই স্পেসিফিকেশন এটি সমাধানের জন্য তৈরি করা হয়েছিল, তবে দুর্ভাগ্যক্রমে এটির এখনও কোনও বাস্তবায়ন হয়নি।
এটি একটি সুন্দর বিস্তারিত বিষয়, এবং আমি বেশিরভাগই আমার মাথার উপরের অংশে এই সমস্ত লিখছি।
তবে যাইহোক, কিছু অসম্পূর্ণ, নিজের-নিজের ঝুঁকিতে ব্যবহার, সম্ভবত বগি (সিউডো) কোড:
ClassLoader
class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name is white-listed JDK class) return super.loadClass(name);
return findClass(name);
}
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
}
}
নিরাপত্তা ব্যবস্থাপক
class MySecurityManager extends SecurityManager {
private Object secret;
public MySecurityManager(Object pass) { secret = pass; }
private void disable(Object pass) {
if (pass == secret) secret = null;
}
}
থ্রেড
class MyIsolatedThread extends Thread {
private Object pass = new Object();
private MyClassLoader loader = new MyClassLoader();
private MySecurityManager sm = new MySecurityManager(pass);
public void run() {
SecurityManager old = System.getSecurityManager();
System.setSecurityManager(sm);
runUntrustedCode();
sm.disable(pass);
System.setSecurityManager(old);
}
private void runUntrustedCode() {
try {
loader.loadClass("customclassname")
.getMethod("main", String[].class)
.invoke(null, new Object[]{...});
} catch (Throwable t) {}
}
}
Thread.stop
জাভা লাইব্রেরি কোডে সমস্যা সৃষ্টি করবে। একইভাবে, জাভা লাইব্রেরি কোডের অনুমতি প্রয়োজন হবে।SecurityManager
ব্যবহার করার অনুমতি দেওয়ার চেয়ে আরও ভালjava.security.AccessController
। ক্লাস লোডার সম্ভবত ব্যবহারকারী কোডের নিজস্ব ক্লাসে অ্যাক্সেসের অনুমতি দেওয়া উচিত।