Java Как читать / писать файл в classpath из статического метода - PullRequest
0 голосов
/ 27 сентября 2018

Я делаю лицензию на программные продукты моего работодателя.Приложение представляет собой веб-приложение, развернутое в Tomcat.Приложение развернуто в помещении клиента.

Я использую 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 голосов
/ 10 января 2019

Это неправильный дизайн.Прилично защищенное веб-приложение никогда не должно иметь разрешений на запись в свой собственный код или где-либо в classpath.Полная остановка.Невыполнение этого предлагает несанкционированные векторы атаки, если необходимо скомпрометировать один единственный фрагмент приложения.

Таким образом, все, что под src/main/resources должно рассматриваться только для чтения.Правильным способом было бы иметь выделенный каталог, опционально объявленный в переменной среды, где вы можете написать все, что вам нужно.Если это не случайность, если getResource предоставляет доступ только для чтения, и любая попытка его обойти создаст проблемы:

  • безопасность, как я объяснил в моем первом абзаце
  • неразорвавшиеся войныпо определению только для чтения

Если у вас где-то есть каталог data , не будет головной боли режима для преобразования ресурса в простой файл: у вас есть простой файл и вы можете делать то, что хотитес этим.

Я должен признать, что это немного больше, чем мое мнение, но я действительно призываю вас дважды подумать о доступных для записи ресурсах.

...