Я вважаю, що читання CSRF-значення з DOM не є гарним рішенням, це лише обхідне рішення.
Ось офіційний веб-сайт angularJS http://docs.angularjs.org/api/ng.$http :
Оскільки тільки JavaScript, який працює на вашому домені, може читати файли cookie, ваш сервер може бути впевнений, що XHR прийшов з JavaScript, що працює на вашому домені.
Щоб скористатися цим (Захист CSRF), ваш сервер повинен встановити маркер у файлі cookie, що читається в JavaScript, під назвою XSRF-TOKEN при першому запиті HTTP GET. На наступних запитах, які не є GET, сервер може перевірити, що файл cookie відповідає заголовку HTTP X-XSRF-TOKEN
Ось моє рішення на основі цих інструкцій:
Спочатку встановіть файл cookie:
# 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
Потім ми повинні перевірити маркер для кожного запиту, який не GET.
Оскільки Rails вже побудований подібним методом, ми можемо просто просто його перекрити, щоб додати нашу логіку:
# 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