ограничить доступ к определенным файлам, папкам на веб-сервере python tornado - PullRequest
0 голосов
/ 19 апреля 2019

Я запускаю веб-сервер торнадо в python3, вот несколько упрощенных кодов запуска:

import tornado.ioloop, tornado.web
root = os.path.dirname(__file__)
startPage = 'index.html' 

class allStops(tornado.web.RequestHandler):
    def get(self):
        self.write('yo man')

def make_app():
    return tornado.web.Application([
        (r"/API/allStops", allStops),
        (r"/(.*)", tornado.web.StaticFileHandler, {"path": root, "default_filename": startPage})
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(5005)
    tornado.ioloop.IOLoop.current().start()

Веб-сервер работает нормально. У меня есть различные файлы и папки вокруг index.html. Поэтому, когда мы открываем localhost:5005 в браузере, мы видим содержимое index.html (статический веб-сайт) и со ссылками в нем можем получить доступ ко всем остальным вещам. Я также могу просто получить к ним доступ напрямую, введя URL.

Вот в чем моя проблема. Если эта программа в launch.py, тогда я могу видеть всю программу из браузера через localhost:5050/launch.py. Я хочу запретить это. Я также хочу запретить браузеру доступ к содержимому определенной подпапки. Но в то же время я не хочу ограничивать доступ ко всем остальным файлам и папкам: по умолчанию разрешено все состояние. Как я могу это сделать?

1 Ответ

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

Подкласс StaticFileHandler и затем проверьте имена файлов в методе validate_absolute_path. Выявите ошибки 404 или 403 для файлов, которые не хотите обслуживать.

from tornado import web
from tornado.web import HTTPError

class MyStaticFileHandler(web.StaticFileHandler):
    def validate_absolute_path(self, root, absolute_path):
        if absolute_path.endswith('.py'):
            # raise 403 Forbidden error for all files ending with .py
            raise HTTPError(403)

        return super().validate_absolute_path(root, absolute_path)

А затем используйте этот класс в вашем обработчике URL.


Настройка ответа об ошибке:

Если вы установите debug=False, то Tornado автоматически покажет соответствующее сообщение, связанное с кодом состояния, а не исключение.

Если вы хотите отправить собственный шаблон ошибки, вы можете сделать это:

...

def validate_absolute_path(self, root, absolute_path):
    if absolute_path.endswith('.py'):
        self.set_status(404)
        # send a custom 404 response from an html file
        with open("path/to/404.html", "r") as f:
            self.write(f.read())

        return None

    return super().validate_absolute_path(root, absolute_path)
...