Tôi đang cố giải quyết các đường dẫn chuẩn cho tất cả các tệp trong cây thư mục, nhưng vì một số lý do nó sẽ không giải quyết chúng (và liên tục mã bảo mật JVM sẽ giải quyết đúng liên kết tượng trưng) FilePermission và gây ra lỗi bảo mật).java sẽ không liên tục giải quyết các liên kết tượng trưng trên Linux
Env:
$ java -version
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
Một liên kết tượng trưng nổi tiếng trong hệ thống là /usr/share/java/gnome-java-bridge.jar:
$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar
Đoạn mã dưới đây sẽ giải quyết liên kết tượng trưng nổi tiếng này :
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
System.out.println(symlinkedFile.getAbsolutePath());
System.out.println(symlinkedFile.getCanonicalPath());
nhưng sản xuất:
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar
Một thử nghiệm hơn nữa, bằng cách sử dụng đoạn mã sau, đôi khi sẽ trở lại đúng đối với việc kiểm tra sự cho phép, nhưng đôi khi sẽ trả về false:
String symlinkedFilePath =
"/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar";
File symlinkedFile = new File(symlinkedFilePath);
FilePermission recursivePermission = new FilePermission(
symlinkedFile.getParentFile().getParent() + "/-", "read");
FilePermission filePermission = new FilePermission(
symlinkedFile.getAbsolutePath(), "read");
System.out.println(recursivePermission);
System.out.println(filePermission);
System.out.println(
"Can read symlink: " + recursivePermission.implies(filePermission));
Kết quả điển hình là:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: true
nhưng khi gỡ lỗi, nếu tôi bước qua việc tạo tệp FilePermission trên tệp đích, nội bộ đường dẫn được giải quyết cho liên kết tượng trưng và kết quả đầu ra là:
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read)
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read)
Can read symlink: false
Vấn đề là trong ngữ cảnh của ứng dụng trong đó việc kiểm tra quyền thực sự diễn ra, liên kết tượng trưng luôn được giải quyết bởi đối tượng FilePermission, nhưng không bao giờ bởi các cuộc gọi của riêng tôi tới file.getCanonicalPath() như được minh họa ở trên.
Điều này có hợp lý với bất kỳ ai không?
Bạn có thể gửi báo cáo lỗi; Tôi không thể tạo lại vấn đề 'getCanonicalPath()' ban đầu với cả openjdk hoặc jdk mặt trời trên hệ thống Ubuntu 11.04 của tôi. – sarnold
sarnold, bạn có đang sử dụng phiên bản OpenJDK chính xác không? Tự hỏi liệu có lẽ đó là vấn đề trong bản phát hành cụ thể không. hơn nữa, tôi chỉ phát hiện ra rằng tôi có thể nhận được các đường dẫn kinh điển để giải quyết 100% thời gian nếu tôi đặt -Dsun.io.useCanonCaches = false hoặc -Dsun.io.useCanonPrefixCache = false nhưng điều đó có vẻ kỳ quặc. – Ray
Tôi xin lỗi vì tôi không nghĩ đến số phiên bản; 'java -version' báo cáo' OpenJDK Runtime Environment (IcedTea6 1.10.6) (6b22-1.10.6-0ubuntu1) '' OpenJDK 64-Bit Server VM (xây dựng 20.0-b11, chế độ hỗn hợp) '. – sarnold