HTTP istekleri User-Agent veya Content-Type gibi üstbilgiler içerir. Android uygulamaları, tarayıcılar tarafından eklenen üstbilgilerin yanı sıra EXTRA_HEADERS
Intent ekstrası aracılığıyla çerez veya yönlendiren gibi ek üstbilgiler de ekleyebilir. Chrome, güvenlik nedeniyle bir amacın nasıl ve nerede başlatıldığına bağlı olarak ek üstbilgilerin bazılarını filtreler.
İstemci ve sunucu aynı tarafa ait olmadığından kaynaklar arası istekler ek bir güvenlik katmanı gerektirir. Bu kılavuzda, Chrome özel sekmeleri (ör. tarayıcı sekmesinde URL açan uygulamalardan başlatılan intent'ler) aracılığıyla bu tür isteklerin başlatılması ele alınmaktadır. Chrome 83'e kadar geliştiriciler, özel sekme başlatırken istedikleri üstbilgileri ekleyebiliyordu. Chrome, 83 sürümünden itibaren onaylananlar listesinde olmayan üstbilgeler güvenlik riski oluşturduğundan onaylananlar listesindeki kaynak dışı üstbilgeler dışındaki tüm üstbilgileri filtrelemeye başladı. Chrome 86'dan itibaren, sunucu ve istemci bir dijital öğe bağlantısı kullanılarak ilişkilendirildiğinde, kaynaktan kaynaka isteklere onay listesindeki olmayan üstbilgilerin eklenmesi mümkün hale geldi. Bu davranış aşağıdaki tabloda özetlenmiştir:
Chrome sürümü | CORS başlıklarına izin verilir |
---|---|
Chrome 83'ten önceki sürümler | approvelisted, non-approvelisted |
Chrome 83 - Chrome 85 | approvelisted |
Chrome 86 ve sonraki sürümler | approvelisted, dijital öğe bağlantısı ayarlandığında non-approvelisted |
Tablo 1: Onaylanmışlar listesinde olmayan CORS başlıklarının filtrelenmesi.
Bu makalede, sunucu ile istemci arasında nasıl doğrulanmış bir bağlantı oluşturulacağı ve bu bağlantının, onaylanmış listede yer alan ve onaylanmış listede yer almayan HTTP üstbilgilerini göndermek için nasıl kullanılacağı gösterilmektedir. Kod için Özel Sekme Intent'lerine Ek Üstbilgi Ekleme bölümüne atlayabilirsiniz.
Arka plan
Onaylanmış liste ve onaylanmamış liste CORS istek başlıkları
Merkezler Arası Kaynak Paylaşımı (CORS), bir kaynaktan gelen bir web uygulamasının farklı bir kaynaktan kaynak istemesine olanak tanır. CORS-approvelisted başlıkları listesi HTML Standardı'nda tutulur. Onaylananlar listesindeki başlıklara örnek olarak aşağıdaki tabloda gösterilenler verilebilir:
Header | Açıklama |
---|---|
accept-language | Müşterinin anladığı doğal dillerin reklamını yapıyor |
content-language | Mevcut kitleye yönelik dili açıklar |
content-type | kaynağın medya türünü belirtir |
Tablo 2: Onaylanmışlar listesinde yer alan CORS üstbilgileri örneği.
Onaylananlar listesindeki başlıklar, hassas kullanıcı bilgileri içermediği ve sunucunun zararlı olabilecek işlemler gerçekleştirmesine neden olma olasılığı düşük olduğu için güvenli kabul edilir.
Onaylananlar listesinde bulunmayan başlıklara örnekler aşağıdaki tabloda verilmiştir:
Header | Açıklama |
---|---|
bearer-token | İstemcinin kimliğini sunucuda doğrular. |
kaynak | İsteğin kaynağını belirtir |
çerez | Sunucu tarafından ayarlanan çerezleri içerir |
Tablo 3: Onaylananlar listesinde bulunmayan CORS başlıkları örneği.
HTML standardı, onay listesindeki olmayan başlıkların CORS isteklerine eklenmesi konusunda uyarıda bulunur ve sunucular, kaynakta farklı isteklerin yalnızca onay listesindeki başlıkları içerdiğini varsayarlar. Kaynaklar arası alanlardan onaylanmışlar listesindeki olmayan üstbilgilerin gönderilmesi, kötü amaçlı üçüncü taraf uygulamalarının Chrome'un (veya başka bir tarayıcının) depoladığı ve isteklere eklediği kullanıcı çerezlerini kötüye kullanan üstbilgiler oluşturmasına olanak tanır. Çerezler, aksi takdirde mümkün olmayan kötü amaçlı sunucu işlemlerinin kimliğini doğrulayabilir.
Özel Sekmeler isteklerine onaylanmış CORS üst bilgileri ekleme
Özel Sekmeler, web sayfalarını özelleştirilmiş bir tarayıcı sekmesinde başlatmanın özel bir yoludur. Özel Sekme intent'leri CustomTabsIntent.Builder()
kullanılarak oluşturulabilir. Ayrıca, Browser.EXTRA_HEADERS
işareti ile bir Bundle
kullanarak bu intent'lere başlık da 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"));
Onaylanmışlar listesindeki başlıkları, özel sekme CORS isteklerine her zaman ekleyebiliyoruz. Ancak Chrome, onaylananlar listesinde olmayan üstbilgileri varsayılan olarak filtreler. Diğer tarayıcıların davranışı farklı olsa da geliştiricilerin, onaylananlar listesinde olmayan başlıkların genel olarak engellenmesini beklemesi gerekir.
Onaylanmışlar listesindeki olmayan üstbilgilerin özel sekmelere eklenmesi için desteklenen yöntem, önce dijital erişim bağlantısı kullanarak kaynak dışı bağlantıyı doğrulamaktır. Sonraki bölümde, bunların nasıl ayarlanacağı ve gerekli başlıklarla Özel Sekmeler isteği nasıl başlatılacağı gösterilmektedir.
Özel Sekme Intent'lerine Ek Üstbilgi Ekleme
Dijital öğe bağlantıları oluşturma
Onay listesindeki olmayan üstbilgilerin Özel Sekme intent'leri üzerinden iletilmesine izin vermek için Android ve web uygulaması arasında, yazarın her iki uygulamanın da sahibi olduğunu doğrulayan bir dijital öğe bağlantısı oluşturmanız gerekir.
Dijital öğe bağlantısı oluşturmak için resmi kılavuzu uygulayın. Bağlantı ilişkisi için "delegate_permission/common.use_as_origin" değerini kullanın. Bu değer, bağlantı doğrulandıktan sonra her iki uygulamanın da aynı kaynağa ait olduğunu gösterir.
Ek Üstbilgilerle Özel Sekme Niyeti Oluşturma
Özel Sekmeler intent'i oluşturmanın birden fazla yolu vardır. Kitaplığı derleme bağımlılıklarına ekleyerek androidX'te bulunan oluşturucuyu kullanabilirsiniz:
MULTI_LINE_CODE_PLACEHOLDER_1
Niyeti oluşturun ve ek üstbilgi ekleyin:
MULTI_LINE_CODE_PLACEHOLDER_2
Öğe bağlantısını doğrulamak için özel sekme bağlantısı oluşturma
Özel Sekmeler bağlantısı, uygulama ile Chrome sekmesi arasında CustomTabsSession
oluşturmak için kullanılır. Uygulamanın ve web uygulamasının aynı kaynağa ait olduğunu doğrulamak için oturuma ihtiyacımız var.
Doğrulama yalnızca dijital öğe bağlantıları doğru şekilde ayarlanmışsa geçer.
CustomTabsClient.warmup()
numaralı telefonu aramanız önerilir. Bu, tarayıcı uygulamasının arka planda ön başlatmasına ve URL açma sürecini hızlandırmasına olanak tanır.
MULTI_LINE_CODE_PLACEHOLDER_3
Doğrulama işleminden sonra intent'i başlatan bir geri çağırma ayarlama
CustomTabsCallback
oturuma aktarıldı. onRelationshipValidationResult()
, kaynak doğrulaması başarılı olduğunda önceden oluşturulmuş CustomTabsIntent
'ı başlatacak şekilde ayarlanır.
MULTI_LINE_CODE_PLACEHOLDER_4
Özel sekmeler hizmet bağlantısını bağlama
Hizmeti bağlamak, hizmeti başlatır ve bağlantının onCustomTabsServiceConnected()
süreci sonunda çağrılır. Hizmetin bağlamasını uygun şekilde kaldırmayı unutmayın. Bağlama ve çözme işlemleri 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 bilgiyi burada bulabilirsiniz. Ç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österilmiştir. Onaylanmışlar listesindeki başlıklar, her özel sekme CORS isteğine eklenebilir. Onaylanmışlar listesinde olmayan başlıklar genellikle CORS isteklerinde güvenli olarak kabul edilmez ve Chrome bunları varsayılan olarak filtreler. Bu öğelerin eklenmesi yalnızca dijital öğe bağlantısıyla doğrulanmış, aynı kaynaktaki istemciler ve sunucular için izin verilir.