DOM'den CSRF değerini okumak iyi bir çözüm değil, sadece geçici bir çözüm olduğunu düşünüyorum.
İşte bir belge formu angularJS resmi web sitesi http://docs.angularjs.org/api/ng.$http :
Yalnızca etki alanınızda çalışan JavaScript çerezi okuyabildiğinden, sunucunuz XHR'nin etki alanınızda çalışan JavaScript'ten geldiğinden emin olabilir.
Bundan (CSRF Koruması) yararlanmak için, sunucunuzun ilk HTTP GET isteğinde XSRF-TOKEN adlı JavaScript tarafından okunabilir oturum tanımlama bilgisinde bir belirteç ayarlaması gerekir. Sonraki GET dışı isteklerde sunucu, tanımlama bilgisinin X-XSRF-TOKEN HTTP başlığıyla eşleştiğini doğrulayabilir.
İşte bu talimatlara dayalı çözümüm:
Önce çerezi ayarlayın:
# app/controllers/application_controller.rb
# Turn on request forgery protection
protect_from_forgery
after_action :set_csrf_cookie
def set_csrf_cookie
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
Ardından, GET olmayan her istekte belirteci doğrulamalıyız.
Rails zaten benzer yöntemle oluşturduğundan, mantığımızı eklemek için onu basitçe geçersiz kılabiliriz:
# app/controllers/application_controller.rb
protected
# In Rails 4.2 and above
def verified_request?
super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
end
# In Rails 4.1 and below
def verified_request?
super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
end