Брандмауэр Symfony2: защита /веб-папка


Я разрабатываю веб-приложение SF2, которое полностью защищено брандмауэром: никто не должен иметь возможности видеть или изменять что-либо до входа в систему (кроме формы входа, конечно).

Итак, вот firewall часть моего security.yml файла:

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main_login:
        pattern:   ^/login$
        anonymous: true
    main:
        pattern:        ^/
        anonymous:      false
        form_login:
            login_path: fos_user_security_login
            check_path: fos_user_security_check
        logout:
            path:       fos_user_security_logout
            target:     /

Это отлично работает: если я введу URL-адрес http://mywebsite.com/app.php/article/show/1 без регистрации, я буду перенаправлен на страницу входа в систему.

Моя проблема в том, что у меня есть некоторые документы и медиафайлы, расположенные в каталоге Symfony web (например, myapp/web/document/myTextFile.txt). Они являются доступно через мое приложение для зарегистрированных пользователей, но также и для незарегистрированных пользователей!

Любой, кто наберет http://mywebsite.com/app.php/document/myTextFile.txt, может загрузить файл...

Почему строка pattern: ^/ не предотвращает этого? Исключена ли папка web по умолчанию, потому что она содержит папку app.php и js/ и css/?

Как я могу защитить свои документы?


Обновление: Отображение защищенных изображений

Я попробовал решение, предложенное Джерри, оно отлично работает для защиты загрузки мои документы.

Однако у меня также есть фотографии в моей папке document, и я хотел бы отобразить эти фотографии, непосредственно включенные в соответствующие страницы.

Например, в http://mywebsite.com/app.php/article/show/1 будет некоторый текст и картинка myapp/app/Resources/document/AAA.jpg, а в http://mywebsite.com/app.php/article/show/2 будет некоторый текст и картинка myapp/app/Resources/document/BBB.jpg и т.д.

Я пытался сделать это с помощью Assetic, но, похоже, это делается для "статических" изображений (например, верхнего логотипа или изображений, которые не зависят от объекта).

Решение, которое я вижу, состоит в том, чтобы преобразуйте изображение в Base64 и включите его следующим образом: <img alt="" src="data:image/png;base64(...)" />, но оно кажется действительно уродливым...

Author: Blacksad, 2015-06-16

2 answers

Веб-каталог - это ваш общедоступный корневой каталог, обслуживаемый веб-сервером (Apache/Nginx/...).

По умолчанию любой запрос к существующему файлу вообще не проходит Symfony, поэтому никакие настройки брандмауэра не будут препятствовать доступу к файлам, находящимся в корневом каталоге веб-сайта.

Чистое решение состоит в том, чтобы переместить эти файлы в другой каталог, за пределами веб-корня, например app/Resources/uploads. Затем вы могли бы написать контроллер Symfony для загрузки этих файлов.

 1
Author: Gerry, 2015-06-16 15:43:26

У меня сейчас нет рабочей установки Symfony, но попробуйте переместить свои документы из Интернета, если брандмауэр продолжит работу.

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

 0
Author: Michal Takáč, 2015-06-16 13:52:45