我有一个从后端服务器检索字节数组的applet。此字节数组包含一个动态库(DLL或SO,具体取决于运行applet的操作系统),必须将其写入磁盘,然后通过调用System.load()从磁盘加载。
我需要确保文件在写入磁盘之后以及操作系统通过调用System.load()加载之前没有被篡改。我获得了一个独占锁定将文件写入磁盘时,但是我的测试显示我必须在调用System.load()之前释放此锁,否则它将无法加载库。
在我加载文件时,是否有某种方法可以锁定文件?
示例代码:
File f = File.createTempFile("tmp", "");
RandomAccessFile raf = new RandomAccessFile(f, "rwd");
FileChannel channel = raf.getChannel();
FileLock lock = channel.lock(0, Long.MAX_VALUE, false);
// This would be where I write the DLL/SO from a byte array...
raf.write((int)65); // 'A'
raf.write((int)66); // 'B'
raf.write((int)67); // 'C'
System.out.println("Wrote dynamic library to file...");
// Close and release lock
raf.close();
System.out.println("File closed. Lock released.");
// This call fails if the file is still locked.
System.load(f.getAbsolutePath());
非常感谢任何帮助。解决方案(如果有的话)不能是任何操作系统的本机,而是适用于Java支持的所有平台。此解决方案还要求与Java 1.4兼容。
答案 0 :(得分:0)
java.nio.file.spi.FileSystemProvider
),因此库内容将完全在内存中,从而使攻击者的生活更加艰难。只是出于兴趣 - 你得到的错误究竟是什么?