我正在为我的雇主的软件产品颁发许可证。该应用程序是部署在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无法写回。我的代码有什么问题吗?
答案 0 :(得分:0)
那是一个错误的设计。体面安全的Web应用程序不应该有权写入其自己的代码,也不应该在classpath中的任何位置。句号如果要破坏应用程序的单个部分,则不这样做会提供无限的攻击媒介。
因此src/main/resources
下的所有内容都应被视为只读。正确的方法是有一个专用目录,可以选择在一个环境变量中声明该目录,您可以在其中编写所需的任何内容。如果不是偶然的情况,getResource
仅授予只读访问权限,而任何绕过它的尝试都会带来问题:
一旦在某个地方有一个 data 目录,就不会出现将资源转换为纯文件的方式:您有一个纯文件并且可以用它来做您想做的事情。
我必须承认,这仅是我的看法,但我真的敦促您对可写资源进行三思。