Googlebot вызывает недопустимый запрос Cross Origin (COR) на Rails 4.1

Как предотвратить Google от этой ошибки при обходе сайта? Мне не интересно отключать "protect_from_forgery", если это не безопасно.

[fyi] method=GET path=/users format=*/* controller=users action=show status=200 duration=690.32 view=428.25 db=253.06 time=  host= user= user_agent=Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) session= params={""} ()
[hmm] Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding. (pid:)
[fyi] method=GET path=/users/123/flag format=*/* controller=users action=flag status=500 error='ActionController::InvalidCrossOriginRequest:Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.' duration=26.50 time= host= user= user_agent= session= params= (pid)
[omg] ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.):
actionpack (4.1.4) lib/action_controller/metal/request_forgery_protection.rb:217:in `verify_same_origin_request'

Контроллер отвечает этим

respond_to do |format|
    format.js { render template: 'users/flag', layout: "some_layout" }
end

Я не могу воссоздать ошибку, и, похоже, она работает нормально, когда я делаю это через браузер.

До сих пор я просматривал следующие ресурсы, но большинство из них, похоже, предлагает просто слепо поворачивать CSRF или не отвечает.


Чтобы уточнить: Действие должно быть защищено от CSRF, но я хочу, чтобы Google не сканировал его или не генерировал ошибку при сканировании страницы. Т.е.). Я хочу, чтобы ложные положительные предупреждения безопасности уходили, не подвергая риску мои функции безопасности.

Ответ 1

Робот Googlebot использует формат "*/*" (http://apidock.com/rails/Mime), и приложение отображает js, поскольку это единственная доступная вещь. Поскольку он удаленный, он корректно вызывает неверный COR.

Это было воспроизведено с использованием:

curl -H "Accept: */*" https://www.example.com/users/123/flag

Исправление состоит в том, чтобы иметь запасной ресурс html для сканирования пауком:

respond_to do |format|
  format.html { render template: 'users/flag' }
  format.js { render template: 'users/flag', layout: "some_layout" }
end

Ответ 2

В соответствии с "Защита CSRF от удаленных тегов" из направляющих направляющих:

В случае тестов, когда вы также делаете клиент, измените с:

get: index, format:: js

To:

xhr: get,: index, format:: js

http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#csrf-protection-from-remote-script-tags

В случае, если вы хотите, чтобы этот маршрут пропускал проверку csrf, белый список маршрута использует что-то вроде:

protect_from_forgery :except => :create