Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Fallo de los access_control de Symfony

3 de junio de 2015

Hola Javier, tengo un problema, sucede que estoy implementando al seguridad de mi sistema y ya tengo definida la jerarquía de toles, el proveedor, el firewall y los access_control, pero de la manera que lo estoy haciendo es posible inyectar la url y entrar a ella, obviamente esto es una falla de seguridad si sucede así y la realidad es que no se que tengo mal en el security.yml o que me falta, aquí te lo dejo y más abajo te explico que estoy haciendo y basado en lo que está, que hace el:

security:

    encoders:
        Comun\UsuarioBundle\Entity\Usuario: bcrypt

    role_hierarchy:
        ROLE_LIMITADO: ROLE_USUARIO 
        ROLE_TECNICO: [ROLE_LIMITADO]
        ROLE_TRABAJADOR: [ROLE_LIMITADO]
        ROLE_AVANZADOLAB: [ROLE_TECNICO]
        ROLE_AVANZADOADMIN: [ROLE_TRABAJADOR]
        ROLE_ADMINISTRADOR:   [ROLE_AVANZADOLAB, ROLE_AVANZADOADMIN, ROLE_ALLOWED_TO_SWITCH ]

    providers:
        ldap:
            id: ztec.security.active.directory.user.provider

    firewalls:
        ldap:
            provider: ldap
            pattern: ^/
            anonymous: ~
            active_directory:
                login_path: login
                check_path: login_check
                default_target_path: dashboard
                always_use_default_target_path: true
            logout:
                path: logout
                target: login
            remember_me:
                key: mi_clave_no_es_esta
                lifetime: 900
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http }
        - { path: ^/, roles: ROLE_USUARIO }
        - { path: ^/af, roles: ROLE_ADMINISTRADOR }

Decirte además que mi Comun\UsuarioBundle\Entity\Usuario es hijo de la clase user.provider del bundle al que puntea en el provider.ldap.id.

De esta manera cuando logueo a un usuario con rol ROLE_TRABAJADOR me puede inyectar la URL poniendo /af y entra y no debería ser.

¿Qué ves mal?


Respuestas

#1

El problema creo que está en el orden en el que has definido las reglas de la sección access_control:

security:
    # ...
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http }
        - { path: ^/, roles: ROLE_USUARIO }
        - { path: ^/af, roles: ROLE_ADMINISTRADOR }

Ten en cuenta que Symfony las comprueba por orden desde la primera hasta la última. Así que tu configuración se interpreta así:

  • Si la URL empieza por /login, puede entrar todo el mundo
  • Si la URL es cualquiera, puede entrar cualquier usuario con el rol ROLE_USUARIO
  • Si la URL empieza por /af, solo pueden entrar los administradores

Lo que tienes que hacer es poner las reglas más restrictivas primero y después las más genéricas:

security:
    # ...
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: http }
        - { path: ^/af, roles: ROLE_ADMINISTRADOR }
        - { path: ^/, roles: ROLE_USUARIO }

@javiereguiluz

3 junio 2015, 8:36