2011-01-22 37 views
8

Tengo un problema con los formularios enviados con ajax. Hago mis formularios con Zend Framework. Algunas son formas reales, así que agrego un elemento Hash. Otros son para operaciones pequeñas (como upvote y downvote aquí) entonces los hago con enlaces.token de CSRF para ajax

Mi problema es que necesito utilizar ajax especialmente para las formas pequeñas (los enlaces). Veo muchas preguntas pero nada lo suficientemente amplio como para resolver el problema. ¿Hay una descripción detallada sobre cómo lograr que el token csrf funcione sin problemas cuando los formularios se envían a través de ajax? preferiblemente con Zend Framework, pero las respuestas generales de PHP también lo ayudarán.

Respuesta

7

No necesita un token CSRF. En su caso, utilice el método HTTP_X_REQUESTED_WITH (consulte, por ejemplo, here).

+0

Leí sobre el encabezado REQUESTED_WITH en esta pregunta http://stackoverflow.com/questions/3664044/anti-csrf-token-an d-javascript/3665136 # 3665136 pero los comentarios de Rook (y la respuesta en sí) dicen que no es realmente seguro. Entonces, si lo uso, creo que aún necesito agregarle "algo más". ¿Cual es tu opinion? – samquo

+0

@samquo jaja Me gusta cómo mi nombre aparece mucho en la seguridad SO. Pero es cierto, si marca x_requested_with unexploitable debido a la misma política de origen para XHR. – rook

+2

Por cierto, es posible que desee observar un comportamiento diferente al de confiar en REQUESTED_WITH: ambos Rails y Django se han actualizado recientemente para dar cuenta de las instancias en las que eso puede no ser una protección suficiente. Aquí están las notas de Django sobre su actualización: http://is.gd/JLBrfL No estoy seguro de cómo lograr eso con Zend, sin embargo :) Encontré esto mientras buscaba CSRF y AJAX. – Rob

0

Para aquellos que vienen a esta página, es posible obtener csrf trabajando con ajax.

En el controlador tendrá que regenerar el hash utilizando a través de la adición de este derecho antes del final de la acción:

$ form-> hash> initCsrfToken();

$ this-> view-> csrfhash = $ form-> hash-> getValue();

En el js archivo que está utilizando para hacer el Ajax, vas a tener que utilizar un selector para encontrar la instancia del hash, ya que se crea (por lo que para jQuery:

$ (# hash) .replaceWith (csrfhash);.. en realidad si se utiliza sustituir con que va a sustituir todo el elemento csrf oculta incluyendo el identificador y el nombre Pero esa parte debe ser bastante fácil de hacer