HTTP isteklerinde User-Agent veya Content-Type gibi başlıklar bulunur. Android uygulamaları, tarayıcılar tarafından eklenen başlıklardan ayrı olarak EXTRA_HEADERS
Intent ekstrası aracılığıyla Cookie veya Yönlendiren gibi ekstra üstbilgiler ekleyebilir. Chrome, güvenlik nedenleriyle bir amacın nasıl ve nerede başlatıldığına bağlı olarak bazı ek üst bilgileri filtreler.
İstemci ve sunucu aynı tarafa ait olmadığından kaynaklar arası istekler ek bir güvenlik katmanı gerektirir. Bu kılavuzda, bu tür isteklerin Chrome özel sekmeleri (yani tarayıcı sekmesinde bir URL'yi açan uygulamalardan başlatılan amaçlar) başlatılması açıklanmaktadır. Chrome 83'e kadar geliştiriciler, Özel Sekme başlatırken istedikleri üstbilgiyi ekleyebiliyordu. Chrome, sürüm 83'ten itibaren güvenlik riski oluşturacağından, onaylanan çapraz kaynak başlıklar hariç tüm kaynakları filtrelemeye başlamıştır. Chrome 86'dan itibaren, sunucu ve istemci bir dijital varlık bağlantısı kullanarak ilgili olduğunda, kaynaklar arası isteklere onaylanmamış başlıklar eklemek mümkündür. Bu davranış aşağıdaki tabloda özetlenmiştir:
Chrome sürümü | CORS başlıklarına izin veriliyor |
---|---|
Chrome 83'ten önce | onaylı, onaylı değil |
Chrome 83 - Chrome 85 | onay listesinde |
Chrome 86'dan itibaren | dijital varlık bağlantısı oluşturulduğunda onaylananlar listesine alınır, onaylanmazlar |
Tablo 1.: Onaylanmayan CORS başlıklarını filtreleme.
Bu makalede, sunucu ile istemci arasında doğrulanmış bir bağlantının nasıl kurulacağı ve bu bağlantının, onaylanan ve onaylı olmayan http üstbilgileriyle birlikte gönderilmesi için nasıl kullanılacağı gösterilmektedir. Kod için Özel Sekme Amaçlarına Fazladan Üstbilgiler Ekleme bölümüne atlayabilirsiniz.
Arka plan
onaylı ve onaylanmamış CORS İstek Başlıkları
Ortamlar Arası Kaynak Paylaşımı (CORS), bir kaynaktaki web uygulamasının farklı bir kaynaktan kaynaklar istemesine olanak tanır. CORS onaylı başlıkların listesi HTML Standardı'nda korunur. Onaylananlar listesine örnek başlıklar sonraki tabloda gösterilmiştir:
Header | Açıklama |
---|---|
kabul-dil | Müşterinin anladığı doğal dillerde reklam yayınlama |
içerik-dili | mevcut kitleye yönelik dili açıklar |
içerik türü | kaynağın medya türünü gösterir |
Tablo 2.: Onay listesindeki örnek CORS başlıkları.
Onay listesindeki üstbilgiler, hassas kullanıcı bilgileri içermedikleri ve sunucunun zarar verebilecek işlemler gerçekleştirmesine neden olma olasılıkları düşük olduğu için güvenli olarak kabul edilir.
Onaylanmayan başlık örnekleri aşağıdaki tabloda gösterilmektedir:
Header | Açıklama |
---|---|
hamiline ait-jeton | Sunucudaki istemcinin kimliğini doğrular |
kaynak | isteğin kaynağını belirtir |
çerez | sunucu tarafından ayarlanan çerezleri içerir |
Tablo 3.: Onaylı olmayan CORS başlıkları örneği.
HTML standardı, onaylı olmayan başlıkların CORS isteklerine eklenmesi önerilmez. Buna göre sunucular, kaynaklar arası isteklerin yalnızca onaylananlar listesine eklenmiş başlıklar içerdiğini varsayar. Kaynaklar arası alanlardan onaylanmamış başlıklar göndermek, kötü amaçlı üçüncü taraf uygulamalarının, Chrome'un (veya başka bir tarayıcının) sakladığı ve isteklere eklediği kullanıcı çerezlerini kötüye kullanan başlıklar oluşturmasına izin verir. Çerezler, başka türlü mümkün olmayacak kötü amaçlı sunucu işlemlerinin kimliğini doğrulayabilir.
Özel Sekme isteklerine CORS onaylı başlıklar ekleme
Özel Sekmeler, web sayfalarını özelleştirilmiş bir tarayıcı sekmesinde açmanın özel bir yoludur. Özel Sekme amaçları CustomTabsIntent.Builder()
ile oluşturulabilir. Bu niyetlere Browser.EXTRA_HEADERS
işaretli bir Bundle
kullanarak da başlık ekleyebilirsiniz:
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));
Onaylanan başlıkları, özel sekme CORS isteklerine her zaman ekleyebiliriz. Ancak Chrome, onaylanmayan başlıkları varsayılan olarak filtreler. Diğer tarayıcıların davranışı farklı olsa da geliştiriciler, onaylanmamış başlıkların genel olarak engellenmesini beklemelidir.
Onaylanmayan başlıkları özel sekmelere dahil etmenin desteklenen yolu, önce bir dijital erişim bağlantısı kullanarak kaynaklar arası bağlantıyı doğrulamaktır. Bir sonraki bölümde, bunların nasıl oluşturulacağı ve gerekli başlıklarla bir Özel Sekmelerin nasıl başlatılacağı gösterilmektedir.
Özel Sekme Amaçlarına Ekstra Üstbilgiler Ekleme
Dijital varlık bağlantıları oluşturma
Onaylanmayan başlıkların Özel Sekme amaçları aracılığıyla geçirilmesine izin vermek için Android ve web uygulaması arasında, yazarın her iki uygulamanın da sahibi olduğunu doğrulayan bir dijital varlık bağlantısı oluşturmanız gerekir.
Dijital varlık bağlantısı oluşturmak için resmi kılavuzu takip edin. Bağlantı ilişkisi için, bağlantı doğrulandıktan sonra her iki uygulamanın da aynı kaynağa ait olduğunu belirten "delegate_permission/common.use_as_origin" ifadesini kullanın.
Ekstra Üstbilgilerle Özel Sekme Amacı Oluşturma
Özel Sekmeler amacı oluşturmanın birden çok yolu vardır. Kitaplığı derleme bağımlılıklarına ekleyerek androidX'te sunulan derleyiciyi kullanabilirsiniz:
MULTI_LINE_CODE_PLACEHOLDER_1
Niyeti oluşturun ve fazladan üstbilgiler ekleyin:
MULTI_LINE_CODE_PLACEHOLDER_2
Öğe Bağlantısını Doğrulamak için Özel Sekmeler Bağlantısı Oluşturun
Özel Sekmeler bağlantısı, uygulama ile Chrome sekmesi arasında CustomTabsSession
kurulumu yapmak için kullanılır. Uygulama ile web uygulamasının aynı kaynağa ait olduğunu doğrulamak için oturuma ihtiyacımız vardır.
Doğrulama yalnızca dijital varlık bağlantıları doğru şekilde oluşturulmuşsa geçer.
CustomTabsClient.warmup()
numaralı telefonu çağırmanız önerilir. Tarayıcı uygulamasının arka planda ön başlatma yapmasına olanak tanır ve URL açma işlemini hızlandırır.
MULTI_LINE_CODE_PLACEHOLDER_3
Doğrulama'dan sonra intent'i başlatan bir geri çağırma oluşturun
CustomTabsCallback
oturuma iletildi. Kaynak doğrulaması başarılı olduğunda daha önce oluşturulan CustomTabsIntent
sürümünü başlatmak için onRelationshipValidationResult()
ayarlarını yaptık.
MULTI_LINE_CODE_PLACEHOLDER_4
Özel sekme hizmeti bağlantısını bağlayın
Hizmet bağlandığında hizmet başlatılır ve bağlantının onCustomTabsServiceConnected()
çağrılır. Hizmetin bağlantısını uygun şekilde kaldırmayı unutmayın. Bağlama ve bağlantıyı kaldırma işlemi genellikle onStart()
ve onStop()
etkinlik yaşam döngüsü yöntemlerinde yapılır.
// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
CustomTabsClient.getPackageName(MainActivity.this, null), connection);
// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);
Demo uygulama kodu
Özel Sekmeler Hizmeti hakkında daha fazla bilgiye buradan ulaşabilirsiniz. Çalışan bir örnek uygulama için android-browser-helper GitHub deposuna bakın.
Özet
Bu kılavuzda, özel sekme CORS isteklerine rastgele başlıkların nasıl ekleneceği gösterilmektedir. Onaylanan başlıklar, her özel sekme CORS isteğine eklenebilir. Onaylanmayan başlıklar, CORS isteklerinde genellikle güvenli olmayan kabul edilir ve Chrome bunları varsayılan olarak filtreler. Bunların eklenmesine yalnızca aynı kaynağa sahip olan ve bir dijital varlık bağlantısıyla doğrulanan istemciler ve sunucular için izin verilir.