2014-07-11 15 views
12

Làm cách nào để ngăn Google gây ra lỗi này trong khi thu thập dữ liệu trang web? Tôi không quan tâm đến việc tắt "protect_from_forgery" trừ khi nó an toàn để làm như vậy.Googlebot gây ra Yêu cầu xuất xứ chéo không hợp lệ (COR) trên Rails 4.1

[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' 

Bộ điều khiển đáp ứng với điều này

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

Tôi không thể để tái tạo lỗi và nó dường như làm việc tốt khi tôi làm điều đó thông qua trình duyệt của tôi

Cho đến nay tôi đã xem xét các tài nguyên sau đây nhưng hầu hết dường như chỉ đề nghị chuyển hướng CSRF một cách mù quáng hoặc không được trả lời.


Để làm rõ: Hành động cần được bảo vệ từ CSRF, Nhưng tôi muốn ngăn chặn Google thu thập thông tin hay tạo ra một lỗi thu thập thông tin trang. Tức là.) Tôi muốn Cảnh báo bảo mật dương tính giả biến mất mà không thực sự ảnh hưởng đến các tính năng bảo mật của tôi.

Trả lời

15

Googlebot đang sử dụng định dạng "*/*" (http://apidock.com/rails/Mime) và ứng dụng hiển thị j vì đó là điều duy nhất có sẵn. Kể từ khi nó từ xa, nó chính xác gây ra một COR không hợp lệ.

Đây là tái sản xuất sử dụng:

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

Việc sửa chữa là phải có một nguồn tài nguyên html dự phòng cho các cô gái nhỏ để thu thập thông:

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

Đặt hàng quan trọng ở đây. format.html phải đến trước format.js trong khối respond_to. – sma

+1

Tôi đang chạy vào cùng một vấn đề này, và các bước để tái sản xuất được mô tả trong giải pháp không làm việc cho tôi cho đến khi tôi thay đổi tiêu đề thành '-H 'Accept: */*" ', tại thời điểm này tôi có thể tái tạo lỗi. –

1

Theo "bảo vệ CSRF từ thẻ từ xa" từ đường ray hướng dẫn:

Trong trường hợp kiểm tra, nơi bạn cũng làm khách hàng, hãy thay đổi từ:

get: chỉ số, định dạng:: js

Để:

XHR: có được,: chỉ số, định dạng:: js

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

Trong trường hợp bạn muốn làm cho tuyến đường này bỏ qua kiểm tra csrf, danh sách trắng tuyến đường sử dụng một cái gì đó như:

protect_from_forgery :except => :create 
+0

Điều này có giải quyết được sự cố khi bạn không kiểm soát việc gọi điểm cuối không? Tôi đã cập nhật các bài kiểm tra đã sử dụng này. –

+0

Để quản lý điều đó cho người gọi (và không chỉ để kiểm tra nơi bạn kiểm soát máy khách), hướng dẫn nói: "Nếu bạn thực sự muốn tải JavaScript từ các thẻ từ xa