HTTP istekleri, User-Agent veya Content-Type gibi başlıklar içerir. Tarayıcılar tarafından eklenen üstbilgilerin yanı sıra Android uygulamaları, EXTRA_HEADERS Intent extra'sı aracılığıyla Cookie veya Referrer gibi ek üstbilgiler ekleyebilir. Chrome, güvenlik nedeniyle, bir amaç başlatılma şekline ve yerine bağlı olarak bazı ek başlıkları filtreler.
İstemci ve sunucu aynı tarafa ait olmadığından çapraz kaynak istekler için ek bir güvenlik katmanı gerekir. Bu kılavuzda, Chrome özel sekmeleri aracılığıyla bu tür isteklerin başlatılması (ör. bir URL'yi tarayıcı sekmesinde açan uygulamalardan başlatılan amaçlar) ele alınmaktadır. Chrome 83'e kadar geliştiriciler, özel sekme başlatırken herhangi bir üstbilgi ekleyebiliyordu. Chrome, 83 sürümünden itibaren izin verilenler listesinde olmayan başlıklar güvenlik riski oluşturduğundan, izin verilenler listesinde olmayanlar hariç tüm çapraz kaynak başlıkları filtrelemeye başladı. Chrome 86'dan itibaren, sunucu ve istemci bir dijital öğe bağlantısı kullanılarak ilişkilendirildiğinde, onay listesinde yer almayan başlıkları çapraz kaynak isteklere eklemek mümkündür. Bu davranış aşağ��daki tabloda özetlenmiştir:
| Chrome sürümü | İzin verilen CORS başlıkları |
|---|---|
| Chrome 83'ten önce | izin verilenler listesinde, izin verilenler listesinde değil |
| Chrome 83 ile Chrome 85 arası sürümler | izin verilenler listesine eklenmiş |
| Chrome 86 ve sonraki sürümler | Bir dijital öğe bağlantısı ayarlandığında approvelisted, non-approvelisted |
Tablo 1.: İzin verilenler listesinde olmayan CORS başlıklarının filtrelenmesi.
Bu makalede, sunucu ile istemci arasında doğrulanmış bir bağlantının nasıl kurulacağı ve bu bağlantının, onaylanmış ve onaylanmamış HTTP üstbilgilerini göndermek için nasıl kullanılacağı açıklanmaktadır. Kod için Özel Sekme Amaçlarına Ek Başlık Ekleme bölümüne gidebilirsiniz.
Arka plan
approvelisted ve Non-approvelisted CORS İstek Başlıkları
Merkezler Arası Kaynak Paylaşımı (CORS), bir merkezden gelen web uygulamasının farklı bir merkezin kaynaklarını istemesine olanak tanır. CORS onaylı başlıkların listesi HTML Standardı'nda tutulur. İzin verilenler listesindeki başlık örnekleri aşağıdaki tabloda gösterilmektedir:
| Header | Açıklama |
|---|---|
| accept-language | Müşterinin anladığı doğal dillerin reklamını yapmalıdır. |
| content-language | Mevcut kitleye yönelik dili açıklar |
| content-type | kaynağın medya türünü gösterir |
Tablo 2.: İzin verilenler listesine eklenmiş CORS başlıkları örneği.
İzin verilenler listesindeki başlıklar, hassas kullanıcı bilgileri içermediği ve sunucunun zarar verici olabilecek işlemler yapmasına neden olma ihtimali düşük olduğu için güvenli kabul edilir.
Onay listesinde olmayan başlık örnekleri aşağıdaki tabloda gösterilmektedir:
| Header | Açıklama |
|---|---|
| bearer-token | istemcinin kimliğini bir sunucuda doğrular |
| kaynak | isteğin kaynağını belirtir |
| çerez | sunucu tarafından ayarlanan çerezleri içerir |
Tablo 3.: Onay listesinde olmayan CORS başlıkları örneği.
Onaylı listeye alınmamış başlıkların CORS isteklerine eklenmesi HTML standardı tarafından önerilmez ve sunucular, çapraz kaynak isteklerinin yalnızca onaylı listeye alınmış başlıklar içerdiğini varsayar. Kaynaklar arası alanlardan onay listesinde olmayan başlıklar göndermek, 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 başlıklar oluşturmasına olanak tanır. ��erezler, aksi takdirde mümkün olmayacak kötü amaçlı sunucu işlemlerinin kimliğini doğrulayabilir.
CORS onaylı izin verilenler listesindeki başlıkları özel sekme isteklerine ekleme
Özel Sekmeler, web sayfalarını özelleştirilmiş bir tarayıcı sekmesinde başlatmanın özel bir yoludur. CustomTabsIntent.Builder() kullanılarak özel sekme amaçları oluşturulabilir. Ayrıca, Browser.EXTRA_HEADERS işareti ile Bundle kullanarak bu amaçlara başlıklar 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"));
Onay listesine alınan başlıkları her zaman özel sekmelerdeki CORS isteklerine ekleyebiliriz. Ancak Chrome, onay listesinde olmayan başlıkları varsayılan olarak filtreler. Diğer tarayıcılar farklı davranışlar sergileyebilse de geliştiriciler, genel olarak onaylanmayanlar listesinde yer almayan başlıkların engellenmesini beklemelidir.
Onaylı listeye dahil olmayan başlıkları özel sekmelere eklemenin desteklenen yolu, önce dijital erişim bağlantısı kullanarak kaynaklar arası bağlantıyı doğrulamaktır. Sonraki bölümde, bu ayarların nasıl yapılacağı ve gerekli başlıklarla özel sekme amaçlarının nasıl başlatılacağı gösterilmektedir.
Özel sekme amaçlarına ek başlıklar ekleme
Dijital varlık bağlantıları oluşturma
Onay listesinde olmayan başlıkların Özel Sekme intent'leri üzerinden iletilmesine izin vermek için yazarın her iki uygulamaya da sahip olduğunu doğrulayan Android ve web uygulaması arasında bir Digital Asset Links oluşturulması 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" seçeneğini kullanın. Bu seçenek, bağlantı doğrulandıktan sonra her iki uygulamanın da aynı kaynakta olduğunu gösterir.
Ek üstbilgilerle özel sekme amacı oluşturma
Özel Sekmeler amacı oluşturmanın birden fazla yolu vardır. Kitaplığı derleme bağımlılıklarına ekleyerek androidX'te bulunan oluşturucuyu kullanabilirsiniz:
implementation 'androidx.browser:browser:1.2.0'
Amacı oluşturun ve ek başlıklar ekleyin:
CustomTabsIntent constructExtraHeadersIntent(CustomTabsSession session) {
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
// Example non-cors-approvelisted headers.
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
return intent;
}
Öğe bağlantısını doğrulamak için özel sekme bağlantısı oluşturma
Uygulama ile Chrome sekmesi arasında CustomTabsSession oluşturmak için özel sekmeler bağlantısı kullanılır. Uygulama ile web uygulamasının aynı kaynağa ait olduğunu doğrulamak için oturum gereklidir.
Doğrulama yalnızca Digital Asset Links doğru şekilde ayarlanmışsa başarılı olur.
CustomTabsClient.warmup() numarası aranabilir. Bu özellik, tarayıcı uygulamasının arka planda önceden başlatılmasına ve URL açma sürecinin hızlandırılmasına olanak tanır.
// Set up a connection that warms up and validates a session.
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(@NonNull ComponentName name,
@NonNull CustomTabsClient client) {
// Create session after service connected.
mSession = client.newSession(callback);
client.warmup(0);
// Validate the session as the same origin to allow cross origin headers.
mSession.validateRelationship(CustomTabsService.RELATION_USE_AS_ORIGIN,
Uri.parse(url), null);
}
@Override
public void onServiceDisconnected(ComponentName componentName) { }
};
Doğrulama işleminden sonra amaç başlatan bir geri arama ayarlama
CustomTabsCallback oturuma aktarıldı. Kaynak doğrulama başarılı olduğunda daha önce oluşturulan CustomTabsIntent'ı başlatmak için onRelationshipValidationResult() ayarlandı.
// Set up a callback that launches the intent after session validated.
CustomTabsCallback callback = new CustomTabsCallback() {
@Override
public void onRelationshipValidationResult(int relation, @NonNull Uri requestedOrigin,
boolean result, @Nullable Bundle extras) {
// Launch custom tabs intent after session was validated as the same origin.
CustomTabsIntent intent = constructExtraHeadersIntent(mSession);
intent.launchUrl(MainActivity.this, Uri.parse(url));
}
};
Özel sekmeler hizmet bağlantısını bağlayın
Hizmetin bağlanması, hizmeti başlatır ve bağlantının onCustomTabsServiceConnected()
sonunda çağrılır. Hizmetin bağlantısını uygun şekilde kaldırmayı unutmayın. Bağlama ve bağlamayı kaldırma 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 sekmeler CORS isteklerine rastgele başlıkların nasıl ekleneceği gösterilmiştir. İzin verilen başlıklar, her özel sekmeler CORS isteğine eklenebilir. Onay listesinde olmayan başlıklar, genellikle CORS isteklerinde güvenli olmayan başlıklar olarak kabul edilir ve Chrome bunları varsayılan olarak filtreler. Bunları eklemeye yalnızca dijital öğe bağlantısıyla doğrulanmış, aynı kaynaklı istemciler ve sunucular için izin verilir.