2015-07-22 2 views
1

Пользователь может отправить подпапку/имя файла для загрузки.Безопасное хранение содержимого файлов из подпапки

Вложенная папка/имя файла будет , а затем использована для обслуживания файла из предварительно установленной папки.

В конце концов, я делаю new File(folder, "subfolder/filename").

Но прежде чем сделать это, я также проверить, что !"subfolder/filename".contains("..")

Но достаточно ли этого? Возможно ли сценарий, когда две точки (..) могут не совпадать друг с другом, но все же должны интерпретироваться как две точки при передаче в новый файл (...)?

Есть ли другой способ, по которому пользователь может перемещаться назад и достигать содержимого вне этой папки?

Вам нужно сделать что-то еще, чтобы обеспечить доступ к такой подпапке/имени файла из папки?

+0

«... из предопределенной папки». Может быть более тщательным, чтобы гарантировать, что запрошенная папка на самом деле является дочерним элементом корневой папки, к которой они могут получить доступ. – MadConan

ответ

1

Вы можете выполнить что-то вроде

cd ./\.\. 

В Unix это изменится каталог для родителей. Может быть, вы можете разрешить файл и проверить, находится ли он под правильным родителем?

UPD: выглядит как java. Вы не можете использовать \. \. pattern http://goo.gl/4Rszg5 все еще это не значит, что проверка на ".." достаточно. Лучше проверить канонический путь

1

Можно получить абсолютные пути из ОС, поэтому немного медленнее.

String folderPath = folder.getCanonicalPath() + File.separator; 
File file = new File(folder, "subfolder/filename"); 
String path = file.getCanonicalPath(); 

if (!path.startsWith(folderPath)) { 
    log(Level.ERROR, "Security breach attempt: ..."); 
    return; 
} 

Простая проверка, вероятно, сделать слишком:

Pattern BREACH = Pattern.compile("\\.[\\\\]*\\."); 
if (BREACH.matcher(path).find()) { ... } 

виду, когда вы используете управление версиями или другие «защищенные» файлы/папки, а затем имена файлов или папок, начиная с точки, являются незаконными слишком ,

+0

Я также нашел это только сейчас, принял ответ. Что вы думаете об этом? http://stackoverflow.com/questions/4746671/how-to-check-if-a-given-path-is-possible-child-of-another-path – momomo

+0

@momo Хорошо тоже. Canonical сделал бы немного больше, но это кажется неуместным. И путь/пути более современны. –

+0

Я доверяю способности 'getCanonicalPath' разрешать неоднозначности намного больше, чем любое сопоставление шаблонов; также, если 'folderPath' гарантированно является каноническим путем папки, тогда ссылка @momo по существу эквивалентна. – tucuxi

Смежные вопросы