Rails Doğrulama ID'sini anlama

Rails'teki kimlik doğrulama belirteçleri ilə bir neçə problemim var, çünki mən artıq bir neçə dəfədir.

Amma həqiqətən bu problemi həll etmək və davam etmək istəmirəm. Mən həqiqətin qayğısını başa düşmək istərdim. Bəli, mənim sualım: bu məsələ ilə bağlı hər hansı bir məlumat mənbəyiniz varmı və ya burada daha ətraflı izah etmək üçün vaxt sərf edirsiniz?

856
02 июня '09 в 23:01 2009-06-02 23:01 Ricardo Acras 02 İyun '09 saat 23:01 'da soruşdu 2009-06-02 23:01
@ 10 cavab

Nə olacaq?

Bir istifadəçi bir formanı yaratmaq, güncəlləşdirmək və ya məhv etmək üçün bir forma baxdıqda, Rails tətbiqi təsadüfi authenticity_token yaradır, sessiyada saxlayır və formada gizli bir sahədə yerləşdirir. Bir istifadəçi formu təqdim etdikdə, Rails authenticity_token üçün baxır, onu sessiyada saxlanılan ilə müqayisə edir və istəklərinə uyğun gəlsələr, davam etməyə icazə verilir.

Niyə bu baş verir?

Kimlik şifrənizi oturumda saxladığından, müştəri onun dəyərini bilmir. Bu, insanların bu ərizənin formasını görüntüləmədən Formaları bir Rails tətbiqinə təqdim etməsinə icazə vermir. A xidmətindən istifadə etdiyini düşünün, xidmətə daxil oldunuz və hər şey düzəldilir. İndi xidmət B xidmətindən istifadə etdiyinizə təsəvvür edin və sevdiyiniz şəkli görürsünüz və daha böyük ölçüsünü görmək üçün şəkil çəkdirdiniz. İndi hər hansı bir zərərli kodun B xidmətində olması halında, o, xidmət sorğusunu A (daxil etdiyiniz) göndərə və http://serviceA.com/close_account bir müraciət göndərərək onun hesabını silməsini xahiş edə bilər. Bu CSRF (Cross Site Search Request Subroutine) adlı adlanır.

A xidmətinin kimliyini təsdiqləyən ayələr istifadə edirsə, bu hücum vektoru artıq tətbiq oluna bilməz, çünki xidmət B-dən doğru sorğuda doğru identifikasiya simvolu yoxdur və davam etməyə icazə verilməyəcəkdir.

Docs API meta etiketinin detallarını təsvir edir:

CSRF qorunması protect_from_forgery metodundan istifadə edərək effektivdir və bu, protect_from_forgery yoxlayır və gözlənilənə uyğun deyilsə sessiyanı sıfırlar. Bu üsula zəng default Rails tətbiqləri üçün yaradılmışdır. Standart token parametrinə " authenticity_token " adı verilir. Bu csrf_meta_tags adı və dəyəri, HTML başında csrf_meta_tags daxil olmaqla formaları göstərən hər bir csrf_meta_tags əlavə edilməlidir.

Qeydlər

Rails yalnız qeyri-idempotent üsulları yoxlayır (POST, PUT / PATCH və DELETE). GET talebi doğrulama simgesi üçün yoxlanılmır. Niyə? HTTP spesifikasiyası göstərir ki, GET tələbləri idempotentdir və serverdə resurslar yaratmamalı, dəyişdirilməməli və məhv edilməməli və istək idempotent olmalıdır (eyni əmri bir neçə dəfə yerinə yetirirsinizsə, hər dəfə eyni nəticə əldə etməlisiniz).

Bundan əlavə, faktiki tətbiqin başlanğıcda olduğu kimi daha yaxşı bir təhlükəsizliyin təmin edilməsi bir az daha mürəkkəbdir. Rails hər forma ilə eyni saxlanılan mötərizə vermir. Həmçinin hər dəfə fərqli bir möcüzə yarada və saxlamır. Sessiyada bir kriptoqrafik hash yaradır və saxlayır və səhifə göstərilir hər dəfə saxlanılan ilə eşleşen yeni kriptoqrafik göstəricilər təmin edir. Request_forgery_protection.rb səhifəsinə baxın.

Dərslər

İdentifikatsız metodlarınızı (POST, PUT / PATCH və DELETE) qorumaq üçün authenticity_token istifadə edin. Ayrıca potensial olaraq serverdə resursları dəyişdirə biləcək hər hansı bir GET sorğusuna icazə verməyi unutmayın.


EDIT: GET tələblərinin idempotent olduğunu @erturne'nin şərhini yoxlayın. O bunu məndən daha yaxşı izah edir.

1349
15 окт. Cavab 15 oktyabrda Faysal tərəfindən verilir . 2009-10-15 14:52 '09 at 14:52 2009-10-15 14:52

Nəzarətçi identifikatoru sizin formanızın saytdan göndərildiyini bildiyiniz şəkildə hazırlanmışdır. O, işləyən maşın üzərində yaradılıb, yalnız kompyuterinizin biləcəyi unikal identifikatoru ilə, dolayısı ilə fırıldaqçılıq üçün saxta istəklərə qarşı hücumların qarşısını almağa kömək edir.

AJAX skriptə girişə mane olan relslərlə çətinlik çəkirsinizsə, istifadə edə bilərsiniz

 <%= form_authenticity_token %> 
border=0

formunuzu yaratarkən doğru token yaratmaq.

Bu barədə sənədlər haqqında ətraflı məlumat əldə edin.

126
02 июня '09 в 23:16 2009-06-02 23:16 cavab 02/09/09 tarixində Topher Fangio tərəfindən 23:16 2009-06-02 23:16 tarixində verilir

CSRF nədir?

Doğrulama skripti site seçimi prosesinin qarşısını alır (CSRF). CSRF nədir, soruşursunuz?

Bu, təcavüzkarın seans sessiyasını bilmədən seansları potensial olaraq tutma yoludur.

Script

  • Bankınızın saytını ziyarət edin, daxil olun.
  • Daha sonra hücumçu saytına (məsələn, etibarsız bir təşkilatın reklamını) ziyarət edin.
  • Hücumçunun səhifəsi Transfer Pulları bankının forması ilə eyni sahələri olan bir forma daxildir.
  • Təcavüzkar hesabınızı bilir və hesabından təcavüzkarın hesabına pul köçürmək üçün əvvəlcədən doldurulmuş forma sahələri var.
  • Hücumçular səhifəsindəki formu banka göndərən Javascript daxildir.
  • Forma təqdim edildikdə, brauzer bank səhifəsi üçün cookie fayllarını, o cümlədən sessiya möcüzəsini ehtiva edir.
  • Bank təcili hücumun hesabına pul köçürür.
  • Forma görünməyən bir iframe ola bilər, belə ki, bir hücumun baş vermədiyini heç vaxt bilməyəcəksiniz.
  • Bu, Cross-site Request Forgery (CSRF) adlanır.

CSRF Çözüm :

  • Server serverdən gələn formaları qeyd edə bilər.
  • Hər formada gizli bir sahə kimi əlavə bir identifikasiya simgesi olmalıdır.
  • Siqaret gözlənilməz olmalıdır (təcavüzkar tahmin edə bilməz).
  • Server, səhifələrindəki formalarda etibarlı bir mö'cüzə təmin edir.
  • Server formu təqdim edərkən tokeni yoxlayır, formaları müvafiq simvol olmadan rədd edir.
  • Bir simge nümunəsi: seansın ID'si serverin gizli anahtarı ilə şifrələnir.
  • Rails avtomatik olaraq bu markerlər yaradır: hər bir formada input field authenticity_token baxın.
73
13 июня '12 в 4:54 2012-06-13 04:54 Cavab Rose Perrone tərəfindən 13 İyun 'da 4:54' də verildi 2012-06-13 04:54

Authenticity Token - cross-site istek hücumlarının qarşısını almaq üçün raylar üsulu (CSRF və ya XSRF) .

Sadəcə olaraq, veb tətbiqinizdə PUT / POST / DELETE istəkləri (məzmunu dəyişə bilən üsullar) müştərinin cookie səhifəsinə daxil olan bir üçüncü tərəf (təcavüzkar) deyil, bir müştəri brauzerindən hazırlandığını təmin edir.

34
02 июня '09 в 23:17 2009-06-02 23:17 cavab 02 iyun '09 saat 23:17 'da verilmişdir 2009-06-02 23:17

Minimal hücumun bir nümunəsi qarşısı alınacaq

Mənim veb evil.com mən sizə aşağıdakı formu təqdim etməyə çağırıram:

 <form action="http://bank.com/transfer" method="post"> <p><input type="hidden" name="to" value="ciro"></p> <p><input type="hidden" name="ammount" value="100"></p> <p><button type="submit">CLICK TO GET PRIZE!!!</button></p> </form> 

Sessiya çerezlərindən istifadə edərək bankınıza daxil olsanız, çərəzlər göndəriləcək və transfer sizin məlumatınız olmadan tamamlanacaq.

Bu, CSRF simgesinin oyuna gəldiyi anlamına gəlir:

  • formu qaytarmış GET cavabı ilə Rails çox uzun təsadüfi gizli parametr göndərir
  • brauzer bir POST tələbi yerinə yetirərkən, bu parametrləri birlikdə göndərir və server yalnız uyğun olduqda qəbul edəcəkdir

Beləliklə, orijinal brauzer şəklində belə olacaq:

 <form action="http://bank.com/transfer" method="post"> <p><input type="hidden" name="authenticity_token" value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p> <p><input type="hidden" name="to" value="ciro"></p> <p><input type="hidden" name="ammount" value="100"></p> <p><button type="submit">Send 100$ to Ciro.</button></p> </form> 

Beləliklə, mənim hücum uğursuz olacaq, çünki o, authenticity_token parametrini göndərmir və mən böyük bir təsadüfi sayda olduğum üçün heç bir tahmin edə bilmədi.

Bu qorunma metodu Synchronizer Marker Şablonu deyilir.

Sinxronlaşdırıcı çarxı rəsm eyni mənşə siyasəti səbəbiylə işləyir: əgər banka pis.com'dan bir XET GET tələbi evil.com və nəticəni oxudu evil.com , evil.com oxuyaraq daha sonra sorğu evil.com . Bunu daha da açıqladım: https://security.stackexchange.com/a/72569/53321

OWASP kitabçasını bu və hər hansı digər təhlükəsizlik məsələsində oxumağınızı çox şövqləndirirəm .

Rails markerləri necə göndərir

Əhatə dairəsi: Rails: csrf_meta_tag necə işləyir?

Prinsipcə:

  • form_tag kimi HTML köməkçiləri, bir GET forması olmadıqda forma sizin üçün gizli bir sahə əlavə edin

  • AJAX, jquery-ujs istifadə edərək, avtomatik olaraq işlənir , meta elementlərdən başlığınıza əlavə olan csrf_meta_tags (default şablonda mövcuddur) csrf_meta_tags və bunu etdiyiniz hər hansı bir sorğuda əlavə edir.

    uJS də köhnəlmiş önbelleğe alınmış parçaların formasında mötərizəni yeniləməyə çalışır.

Digər profilaktik tədbirlər

33
12 нояб. Ciro Santilli tərəfindən cavab verildi 法什功 子 露 宪 六四 事件 法轮 kabu 12 Noyabr 2014-11-12 23:30 '14 saat 23:30 'da 2014-11-12 23:30

Authenticity Token çox vacibdir və Rails 3.0 + -dan istifadə edə bilərsiniz

  <%= token_tag nil %> 

yaratmaq

 <input name="authenticity_token" type="hidden" value="token_value"> 

hər yerdə

31
01 авг. cavab Yuan He 01 avqust verilir. 2012-08-01 08:12 '12 saat 08:12 'da 2012-08-01 08:12

Eyni müştəri tərəfindən birdən çox eyni vaxtda istəkləriniz varsa, orijinallığın təsdiq mexanizmindən çəkinin yarış şərtlərinə səbəb ola bilər. Bu vəziyyətdə, server bir neçə identifikasiya simvolunu yaratdıqda, onlardan yalnız biri olmalı və formada əvvəlcədən mö'cüzəni alan müştəri növbəti tələbi icra edə bilməyəcək, çünki çerezin sessiya məkanı yenidən yazılmışdır. Burada bir giriş var və bu tamamilə çətin bir həll deyil: http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/

24
31 авг. cavab ccp 31 avqustda verilir . 2011-08-31 02:52 '11 da 2:52 2011-08-31 02:52

Bir identifikasiya nişanı Cross-site Request Request (CSRF) hücumlarının qarşısını almaq üçün istifadə olunur. Orijinallik möcüzəsini başa düşmək üçün ilk növbədə CSRF hücumlarını başa düşməlisiniz.

CSRF

bank.com müəllifiyəm. Sitenizin bir GET tələbi ilə başqa bir hesaba pul köçürmək üçün istifadə olunan forması var:

2019

14 апр. Adam Zernerin aprelin 14-də verdiyi cavabı 2017-04-14 07:33 '17 də 7:33 2017-04-14 07:33

authenticity_token tələb olunan üsullar

Idempotent üsulları məlumatları təsir etdiyi üçün poçt, qoymaq və silmək kimi idempotent metodlar üçün authenticity_token tələb olunur.

Niyə tələb olunur

Pis əməlləri qarşısını almaq üçün tələb olunur. Authenticity_token, veb-səhifələrdə resursların yaradılması və ya yenilənməsi üçün bir forma yaradıldığı zaman sessiyada saxlanılır, identifikasiya simgesi gizli bir sahədə saxlanılır və forma ilə serverə göndərilir. Tədbirin başlamazdan əvvəl, istifadəçi autentifikasiya göndərdi, seansda saxlanılan authenticity_token istifadə edərək cross-checked. authenticity_token eşleşirse, proses davam edir, əks halda hərəkət etməz.

8
26 февр. Cavab verilir 26 fevral. 2014-02-26 14:13 '14 da 14:13 2014-02-26 14:13

Kimlik doğrulama_token nədir?

Istifadəçi ərizə səhifəsindən başqa bir tətbiqdən və ya saytdan deyil, istək və ya müraciət etməsini təmin etmək üçün raylar tətbiqi tərəfindən istifadə olunan təsadüfi bir düsturdur.

Niyə is_token identifikasiyası tələb olunur?

Tətbiqinizi və ya saytınızı cross-site saytına müraciət etməkdən qorumaq üçün.

Bir formaya kimlik doğrulama_token əlavə etmək üçün necə?

Form_for etiketi istifadə edərək forma yaratsanız, science_id_id avtomatik olaraq əlavə edilir, siz <%= csrf_meta_tag %> istifadə edə bilərsiniz.

3
22 июля '16 в 5:02 2016-07-22 05:02 Cavab Pradeep Sapkota tərəfindən 22 iyul '16 'saat 05:02' də 2016-07-22 05:02 'də verilir