Eu tive o mesmo problema, mas com páginas em cache. As páginas foram armazenadas em buffer com um token de autenticidade antigo e todas as ações usando os métodos post / put / delete foram reconhecidas como tentativas de falsificação. O erro (422 entidade não processável) foi retornado ao usuário.
A solução para o Rails 3:
Adicione:
skip_before_filter :verify_authenticity_token
ou como "sagivo" apontado no Rails 4, adicione:
skip_before_action :verify_authenticity_token
Nas páginas que fazem cache.
Como o @toobulkeh comentou, isso não é uma vulnerabilidade :index
, :show
ações, mas tenha cuidado ao usar isso :put
, :post
ações.
Por exemplo:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Referência: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Nota adicionada por barlop- O Rails 4.2 descontinuou o skip_before_filter em favor do skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "A família de métodos * _filter foi removida da documentação. Seu uso é desencorajado em favor da * _action família de métodos "
Para o Rails 6 (como "collimarco" apontou), você pode usar skip_forgery_protection
e que é seguro usá-lo para uma API REST que não usa dados da sessão.
skip_before_action :verify_authenticity_token
:index, :show
ações. Mas tenha cuidado ao colocar isso em:put, :post
ações!Para mim, a causa desse problema no Rails 4 estava ausente,
Linha no meu layout principal do aplicativo. Eu o excluí acidentalmente quando reescrevi meu layout.
Se não estiver no layout principal, será necessário em qualquer página em que você queira um token CSRF.
fonte
Existem várias causas para esse erro (relacionadas ao Rails 4).
1. Verifique o
<%= csrf_meta_tags %>
presente no layout da página2. verifique se o token de autenticidade está sendo enviado com chamadas AJAX se estiver usando o
form_for
helper com a opção.remote: true
Caso contrário, você pode incluir a linha<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
dentro do bloco de formulários.3. Se a solicitação estiver sendo enviada da página em cache, use o cache de fragmentos para excluir parte da página que envia a solicitação, por exemplo,
button_to
etc., caso contrário, o token ficará obsoleto / inválido.Eu ficaria relutante em anular a proteção csrf ...
fonte
Basta adicionar o
authenticity_token
formulário in para corrigi-lo.fonte
O token de autenticidade é um valor aleatório gerado em sua exibição para provar que uma solicitação é enviada a partir de um formulário no seu site, e não em outro lugar. Isso protege contra ataques CSRF:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Verifique para ver quem é esse cliente / IP, parece que eles estão usando seu site sem carregar suas visualizações.
Se você precisar depurar mais, esta pergunta é um bom ponto de partida: Compreendendo o token de autenticidade do Rails
Editado para explicar: significa que eles estão chamando a ação para processar o envio do seu formulário sem nunca renderizá-lo no seu site. Isso pode ser malicioso (por exemplo, postar comentários de spam) ou pode indicar um cliente tentando usar sua API de serviço da web diretamente. Você é o único que pode responder isso pela natureza do seu produto e analisar suas solicitações.
fonte
ActionController::InvalidAuthenticityToken
também pode ser causado por um proxy reverso configurado incorretamente. Este é o caso, se no rastreamento da pilha, você obtiver uma linha parecidaRequest origin does not match request base_url
.Ao usar um proxy reverso (como nginx) como receptor para solicitação HTTPS e transmitir a solicitação não criptografada para o back-end (como o aplicativo Rails), o back-end (mais especificamente: Rack) espera alguns cabeçalhos com mais informações sobre a solicitação original do cliente para poder aplicar várias tarefas de processamento e medidas de segurança.
Mais detalhes estão disponíveis aqui: https://github.com/rails/rails/issues/22965 .
TL; DR: a solução é adicionar alguns cabeçalhos:
fonte
Tarde demais para responder, mas encontrei a solução.
Ao definir seu próprio formulário html, você perde a sequência de tokens de autenticação que deve ser enviada ao controlador por motivos de segurança. Mas quando você usa o auxiliar de formulário do rails para gerar um formulário, obtém algo como seguir
Portanto, a solução para o problema é adicionar o campo authenticity_token ou usar os auxiliares de formulário dos trilhos, em vez de remover, fazer o downgrade ou atualizar os trilhos.
fonte
Se você efetuou uma
rake rails:update
alteração ou alterou recentemente o seuconfig/initializers/session_store.rb
, isso pode ser um sintoma de cookies antigos no navegador. Espero que isso seja feito no dev / test (era para mim) e você pode limpar todos os cookies do navegador relacionados ao domínio em questão.Se estiver em produção e você tiver alterado
key
, considere alterá-lo novamente para usar os cookies antigos (<- apenas especulação).fonte
Eu tive esse problema com chamadas javascript. Corrigi isso com a exigência de jquery_ujs no arquivo application.js.
fonte
Tivemos o mesmo problema, mas percebemos que era apenas para solicitações usando http: // e não com https: //. A causa foi
secure: true
para session_store:Corrigido usando HTTPS ~ em todos os lugares :)
fonte
rails s
(não SSL) em vez do ponto de extremidade SSL que configurei para o desenvolvimento. Não foi até ler seu comentário que percebi o que estava fazendo. Depois que voltei a usar SSL, as coisas começaram a funcionar novamente. Obrigado!secure: true
eu escrevisecure: !Rails.env.development?
Para os trilhos 5, é melhor adicionar
protect_from_forgery prepend: true
do que pular overify_authentication_token
fonte
Adicionar
no
fonte
Eu tive esse problema e o motivo foi porque copiei e colei um controlador no meu aplicativo. Eu precisava mudar
ApplicationController
paraApplicationController::Base
fonte
Eu tive o mesmo problema no localhost. Alterei o domínio do aplicativo, mas no arquivo de URLs e hosts ainda havia o domínio antigo. Atualizei o arquivo de favoritos e hosts do meu navegador para usar o novo domínio e agora tudo funciona bem.
fonte
Talvez você tenha a sua configuração NGINX para HTTPS, mas seus certificados são inválidos? Eu tive um problema semelhante no passado e o redirecionamento de http para https resolveu o problema
fonte
Verifiquei que <% = csrf_meta_tags%> está presente e a limpeza de cookies no navegador funcionou para mim.
fonte
Seguindo as recomendações do Chrome Lighthouse para uma carga mais rápida de aplicativos, assíncrono meu Javascript:
views/layout/application.html.erb
Isso quebrou tudo e ocorreu o erro Token para meus formulários remotos. A remoção
async: true
corrigiu o problema.fonte
Essa resposta é muito mais específica para o Ruby on Rails, mas espero que ajude alguém.
Você precisa incluir o token CSRF em todas as solicitações não GET. Se você está acostumado a usar o JQuery, o Rails possui uma biblioteca auxiliar chamada
jquery-ujs
que é construída sobre ela e adiciona algumas funcionalidades ocultas. Uma das coisas que ele faz é incluir automaticamente o token CSRF em todas asajax
solicitações. Veja aqui .Se você se afastar dele como eu, você pode se deparar com um erro. Você pode simplesmente enviar o token manualmente ou usar outra biblioteca para ajudar a raspar o token do DOM. Veja este post para mais detalhes.
fonte
Para o ambiente de desenvolvimento, tentei muitas dessas tentativas para corrigir esse problema, no Rails 6. Nenhuma delas ajudou. Portanto, se nenhuma dessas sugestões funcionou para você, tente abaixo.
A única solução que encontrei foi adicionar um arquivo txt à sua pasta / tmp.
No diretório raiz do seu aplicativo, execute:
Ou crie manualmente um arquivo com esse nome na sua pasta / tmp. Como isso foi corrigido para mim, presumo que a raiz do problema seja um conflito de cache.
fonte
No trilhos 5, precisamos adicionar 2 linhas de código
fonte
Instalando
pode ajudar
fonte
Problema resolvido ao fazer o downgrade para 2.3.5 de 2.3.8. (além da infame questão "Você está sendo redirecionado".)
fonte