Безопасно ли использовать os.path.abspath для проверки местоположения ненадежного имени файла? - PullRequest
3 голосов
/ 19 апреля 2010

Я не думаю, что что-то упустил. С другой стороны, я новичок.

def GET(self, filename):
    name = urllib.unquote(filename)
    full = path.abspath(path.join(STATIC_PATH, filename))
    #Make sure request is not tricksy and tries to get out of
    #the directory, e.g. filename = "../.ssh/id_rsa". GET OUTTA HERE
    assert full[:len(STATIC_PATH)] == STATIC_PATH, "bad path"
    return open(full).read()

Edit: Я понимаю, что это вернет неправильный код ошибки HTTP, если файл не существует (по крайней мере в web.py). Я исправлю это.

Ответы [ 3 ]

6 голосов
/ 19 апреля 2010

os.path.abspath само по себе вполне безопасно. Ваша проверка assert будет скомпилирована, если она выполняется под python -O, что является одним риском. Если ваш STATIC_PATH не заканчивается надлежащим разделителем каталогов, вы можете случайно разрешить путь, который, как оказалось, имеет префикс - например, если STATIC_PATH равен /foo/bar, вы ошибочно примете файл живым под /foo/barbie/ (поэтому, если STATIC_PATH не заканчивается символом-разделителем, вам нужна более строгая проверка для уверенности).

1 голос
/ 19 апреля 2010

Вообще говоря, решение подобных проблем - огромная боль. Всегда есть какой-то хитрый способ объединения имен путей для создания чего-то, чего программист не ожидал или не планировал.

Лучшим решением, как правило, является обеспечение того, чтобы ваш веб-сервер работал от имени пользователя, которому только имеет доступ к файлам, к которым он должен иметь доступ. Я думаю, что простое решение проблемы ssh - не дать этому пользователю доступ по SSH. Если вам действительно нужно войти в систему под этим пользователем, я рассмотрю возможность входа в систему под другой учетной записью и su -ing к ней.

0 голосов
/ 19 апреля 2010

Убедитесь, что либо STATIC_PATH оканчивается разделителем каталогов, либо символ, следующий за ним в full, является таким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...