SORU
29 Mart 2011, Salı


DİNLENME kimlik doğrulama ve API anahtarı teşhir

GERİSİ hakkında çok yazı okudum ve sorular ÇOK diğer siteler ve bloglar bir çok konuda, hem de bir sürü vardır. Hiç bu kadar spesifik bir soru...nedense sorulan gördüm de, bu kavram etrafında ne yaptıysam aklımı veremiyorum...

Dinlendirici bir API inşa ediyorum ve bunu sağlamak için istiyorum, gördüğüm yöntemlerden biri bir güvenlik belirteci kullanmak. Diğer API kullandım, ve paylaşılan bir sır...mantıklı bir göstergesi oldu. Anlamadığım şey şu, istekleri için bir dinlenme hizmet işlemi olarak yapılan javascript (XHR/Ajax), ne için önlemek birinden koklama bunun dışında basit bir şey gibi FireBug (ya da "kaynağı görüntüle" tarayıcı) ve fotokopi API anahtarı ve daha sonra taklit eden kişi kullanarak anahtar ve gizli?

CEVAP
15 Aralık 2012, CUMARTESİ


Ortaklar sadece kayıtlı etki alanları üzerinde kullanabileceğiniz bir API ifşa ediyoruz. İçeriği kısmen kamu (tercihen tek bildiğimiz etki alanları üzerinde gösterilecek), ama biz kullanıcılar için çoğunlukla özel. Yani:

  • Belirlemek içinnegösterilir, kullanıcı ABD ile oturum açmanız gerekir, ama bu ayrı ayrı ele alınır.

  • Belirlemek içinneredeverileri gösterilir, kamu API anahtarı biliyoruz etki alanlarına erişimi sınırlamak için kullanılır ve özel kullanıcı sağlamak için her şeyden önce veri CSRF karşı savunmasız değildir.

Bu API anahtarı aslında herkes tarafından görülebilir, herhangi bir şekilde bizim ortak kimlik ve 13**. Yine de, güvenli

  1. get-csrf-token.js?apiKey=abc123 bizim istendiğinde:

    1. Veritabanında abc123 anahtar aramak ve bu anahtarın geçerli etki bir liste olsun.

    2. CSRF doğrulama bilgisi için bak. Eğer varsa, güvenli rasgele bir değer oluşturmak ve a HTTP-only oturum çerezi koy. Eğer çerez var ise, mevcut rastgele bir değer almak.

    3. Bir CSRF API anahtarı simgesi ve çerez rastgele bir değer oluşturmak, sign it. (Sunucuda simgeleri bir listesini tutmak yerine, değerleri imzalıyoruz. Her iki değer de imzalı bir ifadesi olarak okunabilir olacak, sorun değil.)

    4. Önbelleğe, çerez eklemek değil, ve bir komut dosyası gibi geri dönmek için yanıt kümesi:

      var apiConfig = apiConfig || {};
      if(document.domain === 'expected-domain.com' 
            || document.domain === 'www.expected-domain.com') {
      
          apiConfig.csrfToken = 'API key, random value, signature';
      
          // Invoke a callback if the partner wants us to
          if(typeof apiConfig.fnInit !== 'undefined') {
              apiConfig.fnInit();
          }
      } else {
          alert('This site is not authorised for this API key.');
      }
      

    Notlar:

    • Yukarıdaki isteği numara sunucu tarafı komut dosyası engellemez, ama etki eşleşen sağlareğerbir tarayıcı tarafından istenen.

    • same origin policy for JavaScript tarayıcı bir XHR (Ajax) yük ve JavaScript kaynağı incelemek için kullanın sağlar. Bunun yerine, normal bir tarayıcı sadece <script src="https://our-api.com/get-csrf-token.js?apiKey=abc123"> (veya dinamik eşdeğer) kullanarak yükleyebilirsiniz, ve sonra kodu çalıştırın. Tabii ki, sunucudeğilCross-Origin Resource Sharing destek ne de oluşturulan JavaScript için JSONP.

    • Tarayıcı script üstünde script yüklemeden önce document.domain değerini değiştirebilirsiniz. Ama aynı kökenli ilke yalnızca etki kısaltmak için izin verirkaldırılıyorönekleri subdomain.example.com wordpress.com, ya da bazı tarayıcılarda bile co.uk bbc.co.uk example.com myblog.wordpress.com yeniden yazma gibi.

    • Eğer JavaScript dosyası bir sunucu tarafı komut dosyası kullanarak bir ihtimal ise o zaman sunucu da Çerez alacak. Ancak, üçüncü parti bir sunucu olamaz, bir kullanıcının tarayıcı bizim yardımcı etki alanı için kurabiye yapmak. Dolayısıyla, getirilen bu CSRF token ve doğrulama tanımlama bilgisi bir sunucu tarafı komut dosyası kullanarak, sadece bir sonraki sunucu tarafı çağırır, bir tarayıcı tarafından kullanılabilir. Ancak, bu tür bir sunucu tarafı çağırır asla kullanıcı çerezi içerir ve bu nedenle sadece kamu veri getirebilir. Bu bir sunucu tarafı komut dosyası ortağının web sitesinden doğrudan kazımak olabilir aynı veri.

  2. Bir kullanıcı oturum açtığında, kullanıcıya ne gibi çerez ayarlayın. (Kullanıcı zaten JavaScript istendi önce giriş yapmış olabilir.)

  3. Sunucuya sonraki tüm API istekleri (ve JSONP istekleri de dahil olmak üzere) CSRF token, CSRF doğrulama tanımlama bilgisi ve oturum (varsa) kullanıcı tanımlama içermelidir. Sunucu şimdi Eğer istek güvenilir olup olmadığını belirlemek

    1. Geçerli bir CSRF token varlığı JavaScript beklenen etki alanından yüklenmiş oldu sağlareğerbir tarayıcı tarafından yüklendi.

    2. Bu CSRF token varlığıolmadandoğrulama tanımlama sahtecilik gösterir.

    3. Hem CSRF token varlığı ve doğrulama tanımlama bilgisi hiçbir şey garanti değil CSRF: bu sunucu tarafı sahte bir istek olabilir, ya da bir tarayıcıdan geçerli bir istek. (Bir tarayıcı desteklenmeyen bir etki alanından bir istek olabilir.)

    4. Kullanıcı tanımlama varlığını kullanıcının oturum açmasını sağlar, ancak kullanıcının belirli bir ortak üyesidir, ne de kullanıcının doğru web sitesi görüntüleme garantilemez.

    5. Kullanıcı tanımlama varlığıolmadanCSRF doğrulama tanımlama sahtecilik gösterir.

    6. Kullanıcı tanımlama varlığını geçerli isteğin bir tarayıcı ile yapılır sağlar. (Kullanıcı varsayarak bilinmeyen bir web sitesinde kimlik bilgilerini girin ve biz yok farz kullanıcıların kendi kimlik bilgilerini kullanarak sunucu tarafında bazı istek hale getirmek ister.) Eğer bizayrıcaCSRF doğrulama tanımlama bilgisi de bir tarayıcı kullanarak alınan CSRF doğrulama tanımlama bilgisi var. Sonraki, eğer bizayrıcabir CSRF geçerli bir imza, token varverasgele sayı CSRF doğrulama tanımlama bilgisi ile eşleşen bir CSRF token, daha sonra JavaScript için belirteç oldu da yapılırken aynı önceki isteği sırasında CSRF çerez oldu set, dolayısıyla da kullanarak bir tarayıcı. Bu yukarıdaki JavaScript kodu token set önce idam edildi, ve o zaman alanı verilen API anahtarı için geçerli olduğunu da ima eder.

      Yani: sunucu şimdi güvenle imzalı token API anahtarı kullanabilirsiniz.

    7. Eğer herhangi bir noktada sunucu isteği güven yoksa, o zaman bir 403 Yasak döndürülür. Widget kullanıcı için bir uyarı göstererek yanıt verebilir.

İmzalı CSRF token için karşılaştırıyoruz olarak CSRF doğrulama tanımlama bilgisi imzalamak için gerekli değildir. Kurabiye imza değil, her HTTP isteği daha kısa hale getirir ve sunucu doğrulama biraz daha hızlı.

Oluşturulan CSRF token doğrulama tanımlama bilgisi ile birlikte süresiz olarak geçerli, ama sadece, tarayıcı kapatılana kadar çok etkili olur.

Belirteç imzası ömrü sınırı edebiliriz. Kullanıcı kapattığında CSRF doğrulama tanımlama bilgisi, the OWASP recommendation tanışmak istersek kaldırabiliriz. Ve birden çok ortaklar arasında kullanıcı başına rasgele sayı değil paylaşmak için, bir çerez adı API anahtarı ekleyebilirsiniz. Ama o zaman bile bir kolayca yenileme CSRF doğrulama tanımlama bilgisi zaman yeni bir belirteç olduğunu arzu ettiğiniz gibi kullanıcılar olabilir tarama aynı sitede birden çok windows, paylaşımı bir tek kurabiye (hangi, ne zaman serinletici olurdu güncellenmiş tüm windows, ve daha sonra JavaScript simgesindeki diğer windows olur artık uyan tek kurabiye).

OAuth kullanmak isteyenler için, Ayrıca Bkz: hangi JavaScript fikrim var OAuth and Client-Side Widgets,. İçinsunucu tarafıhangi JavaScript kodu üzerinde etki alanını sınırlamak için bel bağlayamayız API, kullanımı, kamu API anahtarları yerine gizli anahtarlar kullanıyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • JayzTwoCents

    JayzTwoCents

    26 AĞUSTOS 2012