Es posible restringir una ruta para el AJAX sólo?

Es posible restringir el acceso de un Symfony 2 de la ruta para XHR sólo se pide? Quiero declarar rutas, de los que sólo son accesibles a través de AJAX.

No quiero poner algunas líneas adicionales en cada AJAX específico de acciones como que:

if ($request->isXmlHttpRequest()) {
    //do something
} else {
    //do something else
}

Quiero definir:

  • una regla para las peticiones AJAX
  • una regla para OBTENER/peticiones POST a la misma URL

con el fin de obtener en torno a tener condiciones como la de arriba.

  • Por qué? Los datos que exponen no estarán disponibles para cualquier persona que no podía llegar a él de todos modos.
  • ¿Por qué quieres hacer eso?
  • Desea restringir el acceso a la ruta sólo para peticiones XHR.
  • Si alguien (o dos personas) pregunta a los porque que quieres hacer X, entonces sólo la repetición de lo que se quiere hacer X no es útil.
  • gracias. He añadido una razón, ¿por qué estoy haciendo la pregunta.
  • Mi pregunta fue, «¿por Qué estás tratando de restringir el acceso?» no «¿por Qué utilizar rutas a hacer?».
  • He actualizado a la pregunta. Supongo que no será seguro. Las necesidades de la aplicación se comporte de forma diferente para AJAX y en general a petición del navegador. Es obvio que no es por razones de seguridad.
  • la pregunta era «¿es posible..» – así que si no es compatible directamente desde el marco de trabajo, es también una respuesta.
  • no es, obviamente, por razones de seguridad» Sería una mala cosa para el uso de este por razones de seguridad (por lo que sólo el mismo dominio JS aplicación puede acceder a la ruta)?
  • JQuery encabezados HTTP puede ser falso, por lo que no hay seguridad de ganancia mediante la adición de esas reglas.

InformationsquelleAutor Chris | 2012-07-19

6 Kommentare

  1. 94

    Sé que esta pregunta es un poco más viejo, pero mientras tanto, un nueva forma para lograr esto se introdujo en Symfony 2.4.

    Completamente Personalizado Ruta Coincidente con las Condiciones de

    Para ajax restricción tendría este aspecto:

    contact:
        path:     /contact
        defaults: { _controller: AcmeDemoBundle:Main:contact }
        condition: "request.isXmlHttpRequest()"

    También posible en Anotación:

    /**
     * ContactAction
     *
     * @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
     */
    • Creo que te refieres XMLHttpRequest, con XML en mayúsculas.
    • También puede utilizar simplemente request.isXmlHttpRequest() en condiciones de hacer un trabajo.
  2. 10

    Mi consejo sería definir su propio router de servicio en lugar de por defecto, que se extendería de Symfony\Bundle\FrameworkBundle\Routing\Router, y redefinir el método resolveParameters() con la implementación de su propia lógica para el manejo de requisitos adicionales.

    Y entonces, se podría hacer algo como esto en su enrutamiento:

    your_route:
        pattern:  /somepattern
        defaults: { somedefaults }
        requirements:
            _request_type:  some_requirement
    • Esto suena realmente bien. Cómo el rendimiento relevante es? Es el valor Predeterminado Servicio de Enrutamiento realmente que Mal implementado? Creo que le doy una oportunidad.
    • Bien… Mal o no, es implementado 🙂 Y lo mejor de Symfony2 es que se puede redefinir los servicios y ampliar los reguladores básicos con cualquier funcionalidad 😉
  3. 3

    No estoy seguro de que usted puede prevenir la solicitud teniendo lugar, sin embargo, usted puede comprobar para un XHR solicitud en el Controlador mediante la comprobación de la Solicitud actual

    El código sería este:

    if ($request->isXmlHttpRequest()) {
        //...
    }

    Esto no es 100% fiable, debido a, entre otras cosas, las inconsistencias de los navegadores y la posibilidad de un poder de interferencia. Sin embargo es el método predominante de la comprobación de una solicitud asincrónica y es recomendado por muchos. Si cr

    Parámetro de URL

    Una alternativa sería agregar un parámetro en la URL para identificar la solicitud como asincrónicas. Esto se logra mediante la adición de ?ajax=1 a su URL. A continuación, compruebe el parámetro con:

    $AjaxRequest = $request->getParameter('ajax');
    If($AjaxRequest == 1) {
        //...
    }

    Por supuesto, en este punto también podría crear una Ruta específica por ejemplo,/ajax/index/.

    • En lugar de utilizar > para el resaltado de código, usted debe usar los 4 espacios o `.
    • Gracias, se recuerda que.
    • isXmlHttpRequest no es confiable.
    • Esa es la manera en que lo hago actualmente. Pero quiero quitar esta pieza de código a partir de esas acciones.
    • Gracias por poner de relieve que los. He actualizado mi respuesta con un poco más de explination en la confiabilidad.
  4. 2

    No, No puedes. Es no depender de que el marco está utilizando, peticiones AJAX, básicamente, son sólo las solicitudes a un servidor. No es 100% fiable solución, sólo «hacks».

    • En el lado del servidor de una aplicación específica sé qué cliente de JavaScript del lado de la Biblioteca está siendo utilizado. Por tanto no es un hack, si voy a requerir de un determinado campo de encabezado http para rutas específicas.
  5. 1

    Lo que estás buscando no existe en Symfony configuración de enrutamiento.

    Solicitud::isXmlHttpRequest es aún no es 100% fiable, y los cheques de los encabezados HTTP de poner por su biblioteca de JavaScript :

    Funciona si su biblioteca de JavaScript de establecer un X-Pidió-Con el encabezado HTTP.
    Es conocido por trabajar con Prototype, Mootools, jQuery.

    • Si yo sé, que mi cilent lado de la biblioteca es uno en concreto, este método va a ser 100% confiable.
  6. 0

    Puede utilizar el requisitos para alcanzar el resultado descrito.

    Así, supongamos que usted está definiendo las rutas en yml formato, tienes que hacer algo como esto

    my_route:
      pattern:  /path/to/route
      defaults: { _controller: CompanyBundle:Controller:Action, _format: html }
      requirements:
          _format:  xmlhttp /* not sure about the correct format because
                               i've never checked about */

    Y se puede utilizar, por supuesto, _method: POST o _method: GET

    • Esto es lo que estoy buscando. Pero, ¿qué es el hormigón nombre de valor?
    • la documentación sobre el es muy, muy, muy buenos. Sugiero comenzar con el parámetro sugiero a usted y, a continuación, intentar algo como «xml» o «ajax», directamente. Ahora soy actualmente no a una máquina que permitt mí para hacer este tipo de prueba.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea