Java如何从静态方法读取/写入类路径中的文件

时间:2018-09-27 08:20:05

标签: java file-writing

我正在为我的雇主的软件产品颁发许可证。该应用程序是部署在tomcat中的Web应用程序。该应用程序在cusotmer前提下部署。

我正在使用maven作为构建工具。我的测试许可证文件位于src/main/resources/License.lic。这意味着我需要阅读包含加密文本的License.lic。用户登录后,我解密并检查许可证是否仍然有效。最后,我将一些内容写回到许可证文件(License.lic)中。

我遇到的问题是,检查后,我修改了更新的文本并将其加密,但是无法写回license.lic。读写都是静态方法。

我写回License.lic的代码如下:

protected static void writeToLicense(LicenseData licData) throws Exception{
        String plainText = licData.toString();
        String encText = LicenseEncDec.encrypt(plainText);
        System.out.println("encText is "+encText);

        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        URL url = classLoader.getResource(licFileName1);
        File file = new File(url.toURI().getPath());    

        PrintWriter pw = new PrintWriter(new FileWriter(file));
        pw.println(encText);
        pw.flush();
        pw.close();
    }   

从License.lic中读取内容如下:

private static String readFile() throws IOException {

    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    InputStream is = loader.getResourceAsStream(licFileName1);

    BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

    String line = br.readLine();

    br.close();
    is.close();

    return line;
}   

License.lic无法写回。我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

那是一个错误的设计。体面安全的Web应用程序不应该有权写入其自己的代码,也不应该在classpath中的任何位置。句号如果要破坏应用程序的单个部分,则不这样做会提供无限的攻击媒介。

因此src/main/resources下的所有内容都应被视为只读。正确的方法是有一个专用目录,可以选择在一个环境变量中声明该目录,您可以在其中编写所需的任何内容。如果不是偶然的情况,getResource仅授予只读访问权限,而任何绕过它的尝试都会带来问题:

  • 我在第一段中解释的安全性
  • 未爆炸的战争按定义是只读的

一旦在某个地方有一个 data 目录,就不会出现将资源转换为纯文件的方式:您有一个纯文件并且可以用它来做您想做的事情。

我必须承认,这仅是我的看法,但我真的敦促您对可写资源进行三思。