Fazladan HTTP İstek Üstbilgileri ekleme

Pavol Drotar
Pavol Drotar

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

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

Ö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.