2014-07-11 21 views
12

Jak zapobiec temu problemowi Google podczas indeksowania witryny? Nie jestem zainteresowany wyłączeniem "protect_from_forgery", chyba że jest to bezpieczne.Googlebot powoduje nieważne żądanie Cross Origin Request (COR) w 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' 

Sterownik reaguje z tym

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

jestem w stanie odtworzyć błąd i wydaje się działać prawidłowo, kiedy mogę to zrobić za pośrednictwem mojej przeglądarce

Dotychczas Sprawdziliśmy następujące zasoby, ale większość wydaje się sugerować jedynie ślepe obracanie CSRF lub brak odpowiedzi.


Dla wyjaśnienia: Działanie powinno być chronione przed CSRF, ale chcę, aby uniemożliwić Google indeksowanie go lub wygeneruje błąd indeksowania strony. Tj.) Chcę, aby fałszywe pozytywne ostrzeżenia o zabezpieczeniach zniknęły bez faktycznego naruszenia moich funkcji bezpieczeństwa.

Odpowiedz

15

Googlebot używa formatu "*/*" (http://apidock.com/rails/Mime), a aplikacja renderuje js, ponieważ jest to jedyna dostępna opcja. Ponieważ jest on zdalny, poprawnie wywołuje nieprawidłowy COR.

To była powtarzalna przy użyciu:

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

Rozwiązaniem jest posiadanie zasobu html awaryjnej dla pająk pełzać:

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

Zamawianie jest ważne tutaj. format.html powinien pojawić się przed format.js w bloku respond_to. – sma

+1

Występuję w tym samym problemie, a kroki do odtworzenia opisane w rozwiązaniu nie zadziałały, dopóki nie zmieniłem nagłówka na '-H" Accept: */* "', w którym momencie mogę teraz odtworzyć błąd. –

1

jak na „ochronę CSRF z odległych tagów” ​​z szyn przewodnik:

W przypadku testów, w których również klient jest wykonywany, zamień z:

get: index, format: js

Do:

XHR: get: index, format: js

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

W Jeśli chcesz, aby ta trasa pomijała sprawdzanie csrf, wybierz białą listę tras używając czegoś takiego:

protect_from_forgery :except => :create 
+0

Czy to rozwiązuje problem, gdy nie masz wpływu na wywoływanie punktu końcowego? Zaktualizowałem już testy, aby móc z nich korzystać. –

+0

Aby obsłużyć to również dla osoby dzwoniącej (i nie tylko dla testu, w którym kontrolujesz klienta), przewodnik mówi: "Jeśli naprawdę chcesz załadować JavaScript ze zdalnych znaczników