2015-03-25 15 views
6

Trong tài liệu Java, nó đề cập rằng sử dụng phương pháp f.setAccessible(true) chúng ta có thể vi phạm hiệu trưởng của đóng gói.Làm thế nào để ngăn chặn truy cập thông qua sự phản ánh?

Nhưng nếu tôi viết bất kỳ lớp nào có bảo mật đầy đủ, ví dụ với biến riêng tư, làm thế nào tôi có thể ngăn không cho nó bị truy cập bằng sự phản chiếu?

Ví dụ tôi có một lớp học với instance variable bảo đảm đầy đủ:

public final class Immutable { 
    private final int someVal; 

    public Immutable(int someVal) { 
     this.someVal = someVal; 
    } 

    public int getVal() { 
     return someVal; 
    } 
} 

Nhưng tôi có thể sửa đổi mà dụ biến sử dụng phản ánh như thế này:

public class Tester { 
    public static void main(String[] args) 
      throws NoSuchFieldException, SecurityException, 
      IllegalArgumentException, IllegalAccessException { 

     Immutable i = new Immutable(10); 

     // output 10 
     System.out.println(i.getVal()); 

     Field f = i.getClass().getDeclaredField("someVal"); 
     f.setAccessible(true); 
     f.set(i, 11); 

     // output is 11 which implies some value modified 
     System.out.println(i.getVal()); 
    } 
} 

Trong mã của tôi, làm sao tôi có thể ngăn chặn một lớp không thay đổi được thay đổi với sự phản ánh?

+1

vào 'SecurityManager'. –

+1

Trừ khi bạn cho phép những người không biết thêm plugin vào thứ gì đó mà bạn đang tạo, bạn không cần phải lo lắng về điều này. Ứng dụng nào bạn đang cố gắng thực hiện? – satnam

Trả lời

5

JVM có các cơ chế bảo mật được tích hợp sẵn trong đó cho phép bạn xác định các hạn chế mã thông qua tệp chính sách bảo mật Java. Trình quản lý bảo mật Java sử dụng tệp chính sách bảo mật Java để thực thi một tập các quyền được cấp cho các lớp. Các điều khoản cho phép các lớp được chỉ định chạy trong trường hợp đó của JVM để cho phép hoặc không cho phép các hoạt động thời gian chạy nhất định. Nếu bạn bật trình quản lý bảo mật Java nhưng không chỉ định tệp chính sách bảo mật, trình quản lý bảo mật Java sẽ sử dụng các chính sách bảo mật mặc định được xác định trong tệp java.security và java.policy trong thư mục bảo mật $ JAVA_HOME/jre/lib /. Xác định tập tin chính sách của bạn có thể được tìm thấy ở đây http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

0

Mở rộng lớp SecurityManager và ghi đè phương pháp này để hạn chế truy cập phản ánh Look

@Override 
public void checkPackageAccess(String pkg){ 

     // don't allow the use of the reflection package 
     if(pkg.equals("java.lang.reflect")){ 
      throw new SecurityException("Reflection is not allowed!"); 
     } 
    } 
Các vấn đề liên quan