2010-07-29 12 views
101

A continuación se muestra un error, causada por una forma de mi aplicación Rails:ActionController :: InvalidAuthenticityToken

Processing UsersController#update (for **ip** at 2010-07-29 10:52:27) [PUT] 
    Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"ysiDvO5s7qhJQrnlSR2+f8jF1gxdB7T9I2ydxpRlSSk=", **more parameters**} 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 

Esto sucede para cada solicitud no get y, como ves, es authenticity_token allí.

Respuesta

-9

problema resuelto por la degradación hasta 2.3.5 desde 2.3.8. (Así como el famoso 'Usted está siendo redirigido.' Edición)

26

El token de autenticidad es un valor aleatorio generado en su vista para demostrar que una solicitud se envía desde un formulario en su sitio, no en otro lugar. Esto protege contra los ataques CSRF:

http://en.wikipedia.org/wiki/Cross-site_request_forgery

Compruebe que es ese cliente/IP, que parece que están utilizando su sitio sin tener que cargar sus puntos de vista.

Si necesita depurar aún más, esta pregunta es un buen punto de partida: Understanding the Rails Authenticity Token

Editado para explicar: Significa que están llamando a la acción para procesar su forma presente sin jamás la prestación de su formulario en su página web . Esto podría ser malicioso (por ejemplo, publicar comentarios de spam) o podría indicar que un cliente intenta usar su API de servicio web directamente. Usted es el único que puede responder por la naturaleza de su producto y analizar sus solicitudes.

+0

Gracias, pero ya sé lo que es la autenticidad de token. _Verifique quién es ese cliente/IP, parece que está usando su sitio sin cargar sus vistas. Lo siento, ¿qué significa "sin cargar vistas"? –

+1

I significa que alguien (probablemente un spammer) podría estar enviando datos a su formulario sin pasar por la interfaz de usuario de su aplicación. Es posible hacer esto usando un programa de línea de comando como curl, por ejemplo. –

+0

John lo tiene exactamente correcto. Significa que están convocando la acción para procesar el envío de su formulario sin siquiera presentar su formulario en su sitio web. Esto podría ser malicioso (por ejemplo, publicar comentarios de correo no deseado) o podría indicar que un cliente intenta usar su API de servicio web directamente. Usted es el único que puede responder por la naturaleza de su producto y analizar sus solicitudes. – Winfield

161

Tuve el mismo problema pero con páginas que fueron almacenadas en la página. Las páginas se almacenaron en búfer con un token de autenticidad obsoleto y todas las acciones que utilizan los métodos post/put/delete donde se reconocen como intentos de falsificación. Error (422 Entidad no procesable) fue devuelto al usuario.

La solución:
Añadir:

skip_before_filter :verify_authenticity_token 

o como "sagivo" se señala en los carriles 4 add:

skip_before_action :verify_authenticity_token 

En las páginas que hacen el almacenamiento en caché.

Como @toobulkeh comentó que esto no es una vulnerabilidad en :index, :show acciones, pero cuidado con el uso de este en :put, :post acciones.

Por ejemplo:

caches_page :index, :show 
skip_before_filter :verify_authenticity_token, :only => [:index, :show] 

Referencia: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

+3

Ese no es el caso, no sabía de _caches_page_ antes de su publicación. Pero verifico _caches_page_, gracias. –

+7

en rieles 4 'skip_before_action: verify_authenticity_token' –

+58

¿No es esto una vulnerabilidad? – quantumpotato

66

Para mí la causa de esta cuestión en los carriles 4 era una falta,

<%= csrf_meta_tags %> 

Line en mi diseño principal de la aplicación. Lo borré accidentalmente cuando reescribí mi diseño.

Si no está en el diseño principal, lo necesitará en cualquier página en la que desee un token CSRF.

+0

¡Muy bonito! Resolvió mi problema – Jason

+0

También recibimos este error. Pero está interminado. ¿Podría ser esta la razón o no tener esto afectaría cada solicitud con un error? –

+0

@ Ryan-NealMes, si a su plantilla le falta esa línea, obtendrá el error. Por lo tanto, es posible que algunas de sus plantillas lo tengan y los otros no. –

4

Tuve este problema con las llamadas de JavaScript. Lo arreglé con solo requerir jquery_ujs en el archivo application.js.

+0

Sí correcto, también tuve este problema y agregué jquery_ujs en la aplicación js. Funcionó. – Abhi

16

demasiado tarde para responder, pero encontré la solución.

Cuando define su propio formulario html, omite la cadena de token de autenticación que debe enviarse al controlador por razones de seguridad. Pero cuando se utiliza rieles asistente de formulario para generar un formulario que usted consigue algo como siguiente

<form accept-charset="UTF-8" action="/login/signin" method="post"> 
    <div style="display:none"> 
    <input name="utf8" type="hidden" value="&#x2713;"> 
    <input name="authenticity_token" type="hidden" 
     value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA="> 
    . 
    . 
    . 
    </div> 
</form> 

Así que la solución al problema es ya sea para añadir campo o utilizar los carriles authenticity_token forman ayudantes en lugar de la eliminación, descalificación o rieles de mejora.

0

Tuve este problema y la razón fue porque copié y pegué un controlador en mi aplicación. Necesitaba cambiar ApplicationController a ApplicationController::Base

39

Existen varias causas para este error (relacionado con Rails 4).

1. Comprobar <%= csrf_meta_tags %> presente en el diseño de página

2. token de comprobación de autenticidad está siendo enviado con llamadas AJAX si se utiliza form_for ayudante con remote: true opción.Si no puede incluir la línea <%= hidden_field_tag :authenticity_token, form_authenticity_token %> withing el bloque formulario.

3. Si la solicitud se envía desde la página almacenada en caché, use fragment caching para excluir parte de la página que envía la solicitud, p. button_to etc. de lo contrario el token quedará obsoleto/inválido.

sería reacio a anular la protección CSRF ...

1

Si ha hecho un rake rails:update o de otra manera ha cambiado recientemente su config/initializers/session_store.rb, esto puede ser un síntoma de viejas galletas en el navegador. Espero que esto se haga en dev/test (fue para mí), y puedes borrar todas las cookies del navegador relacionadas con el dominio en cuestión.

Si esto está en producción, y ha cambiado key, considere cambiarlo de nuevo para usar las cookies antiguas (< - solo especulación).

0

Instalación

gem 'remotipart' 

puede ayudar a

+1

aunque esta podría ser la respuesta, pero también es útil incluir la parte esencial de la respuesta y explicar por qué/cómo funciona. – Roylee

0

tuvimos el mismo problema, pero se dio cuenta de que era sólo para peticiones usando http: // y no por https: //. La causa fue secure: true para session_store:

Rails.application.config.session_store(
    :cookie_store, 
    key: '_foo_session', 
    domain: '.example.com', 
    secure: true 
) 

fijo utilizando HTTPS ~ todas partes :)

0

que tenían el mismo problema en el servidor local. Cambié el dominio de la aplicación, pero en las URL y en el archivo de hosts todavía existía el dominio anterior. Actualicé los marcadores de mi navegador y el archivo de hosts para usar el nuevo dominio y ahora todo funciona bien.

14

Simplemente agregando el authenticity_token en forma solucionado por mí.

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 
+1

Se supone que Rails debe enviar el token de manera predeterminada. No queremos especificarlo explícitamente. Siento que el token ha cambiado de alguna manera en esta situación aquí. – Abhi

1

Tal vez tenga su configuración de NGINX para HTTPS pero ¿sus certificados no son válidos? He tenido un problema similar en el pasado y la redirección de http a https resolvió el problema

0

He usado algo así y me funciona.

class WelcomeController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_model! 
end 
Cuestiones relacionadas