Security متقدم

استبدل فحوصات SecurityManager المعطّلة بتخويل صريح داخل التطبيق وعزل على مستوى النشر.

✕ JDK 23 and earlier
SecurityManager manager = System.getSecurityManager();
if (manager != null) {
    manager.checkRead(path.toString());
}
return Files.readString(path);
✓ JDK 24+
// Untrusted users must not be able to modify this tree
Path root = allowedRoot.toRealPath();
Path resolved = root.resolve(requested)
    .normalize()
    .toRealPath();
if (!resolved.startsWith(root)) {
    throw new SecurityException(
        "Path is outside the allowed root");
}
return Files.readString(resolved);
هل ترى مشكلة في هذا الكود؟ أخبرنا.
🔍

سياسة صريحة

يكون التخويل واضحاً وقابلاً للاختبار في منطق التطبيق.

🛡️

عزل حقيقي

تحمي حدود العمليات والحاويات ونظام التشغيل التطبيق بأكمله.

🚫

ترحيل مطلوب

يزيل الفحوصات التي لم تعد قادرة على فرض السياسات في JDK 24 والإصدارات الأحدث.

الأسلوب القديم
فحوصات SecurityManager
الأسلوب الحديث
التخويل الصريح
منذ JDK
24
الصعوبة
متقدم
من فحوصات SecurityManager إلى التخويل الصريح
متاح

مطلوب في JDK 24 والإصدارات الأحدث، حيث يعطّل JEP 486 مدير الأمان نهائياً.

عطّل JEP 486 مدير الأمان نهائياً في JDK 24، لذلك لا يمكن للفحوصات عبر System.getSecurityManager() فرض السياسات إلا في JDK 23 والإصدارات الأقدم. يجب على التطبيقات تخويل الوصول صراحةً في منطق المجال؛ ويمنع تحليل مسارات نظام الملفات الحقيقية الروابط الرمزية الموجودة من تجاوز جذر مسموح به عندما يتعذر على المستخدمين غير الموثوق بهم تعديل شجرة الملفات بالتزامن. أما أشجار الملفات التي يمكن للمهاجم الكتابة فيها، فاستخدم معها وصولاً نسبياً إلى المقبض ومقاوماً لسباقات التزامن، مثل SecureDirectoryStream. استخدم حدود العمليات أو الحاويات أو نظام التشغيل للعزل. يحتفظ JDK 24 مؤقتاً بواجهة API المهملة، لكن لا يمكن تمكينها ولم يُستعَض عنها ببيئة اختبار معزولة أخرى داخل العملية.