Web kaynaklarınızı ayırmayı neden önemsemelisiniz? #
Birçok web uygulaması, aşağıdakiler gibi kaynaklar arası saldırılara karşı savunmasızdır: siteler arası istek sahteciliği (CSRF), siteler arası komut dosyası ekleme (XSSI), zamanlama saldırıları, kaynaklar arası bilgi sızıntıları veya spekülatif yürütme yan kanalı (Hayalet) saldırılar.
Meta Verileri Al istek başlıkları, uygulamanızı bu yaygın kaynaklar arası saldırılara karşı korumak için güçlü bir derinlemesine savunma mekanizması (bir Kaynak Yalıtma Politikası) dağıtmanıza olanak tanır.
Belirli bir web uygulaması tarafından sunulan kaynakların diğer web siteleri tarafından değil, yalnızca uygulamanın kendisi tarafından yüklenmesi yaygın bir durumdur. Bu gibi durumlarda, Fetch Metadata istek başlıklarına dayalı bir Kaynak İzolasyon Politikası dağıtmak çok az çaba gerektirir ve aynı zamanda uygulamayı siteler arası saldırılardan korur.
Tarayıcı Uyumluluğu #
Fetch Metadata istek başlıkları tüm modern tarayıcı motorlarında desteklenir.
- Chrome 76, Desteklenir 76
- Firefox 90, Desteklenir 90
- Kenar 79, Desteklenen 79
- Safari 16.4, Desteklenir 16.4
Arka plan #
Web varsayılan olarak açık olduğundan ve uygulama sunucunuz kendisini harici uygulamalardan kaynaklanan iletişimden kolayca koruyamadığı için birçok siteler arası saldırı mümkündür. Tipik bir çapraz kaynak saldırısı, bir saldırganın bir kullanıcıyı kontrol ettiği bir siteye çektiği ve ardından kullanıcının oturum açtığı sunucuya bir form gönderdiği siteler arası istek sahteciliğidir (CSRF). Sunucu, isteğin başka bir etki alanından (siteler arası) kaynaklanıp kaynaklanmadığını anlayamadığından ve tarayıcı, siteler arası isteklere çerezleri otomatik olarak eklediğinden, sunucu, kullanıcı adına saldırgan tarafından istenen eylemi gerçekleştirecektir.
Siteler arası betik dahil etme (XSSI) veya kaynaklar arası bilgi sızıntıları gibi diğer siteler arası saldırılar, doğası gereği CSRF’ye benzer ve kurban uygulamadan saldırgan kontrollü bir belgeye kaynak yüklemeye ve kurban uygulamalar hakkında bilgi sızdırmaya dayanır. Uygulamalar, güvenilen istekleri güvenilmeyen isteklerden kolaylıkla ayırt edemediği için, kötü amaçlı siteler arası trafiği ortadan kaldıramaz.
Fetch Meta Verileri Tanıtımı #
Fetch Metadata istek başlıkları, sunucuların kaynaklar arası saldırılara karşı kendilerini savunmalarına yardımcı olmak için tasarlanmış yeni bir web platformu güvenlik özelliğidir. Bir dizi HTTP isteğinin içeriği hakkında bilgi sağlayarak Sec-Fetch-*
başlıklar, yanıt veren sunucunun isteği işlemeden önce güvenlik ilkelerini uygulamasına izin verir. Bu, geliştiricilerin, yalnızca kendi uygulamaları tarafından yapılan meşru isteklere yanıt vermeyi mümkün kılarak, yapılma biçimine ve kullanılacağı bağlama göre bir isteği kabul edip etmeyeceğine karar vermesini sağlar.
Aynı Menşei
Kendi sunucunuz (aynı kaynak) tarafından sunulan sitelerden kaynaklanan istekler çalışmaya devam edecektir.
siteler arası
Kötü amaçlı siteler arası istekler, tarafından sağlanan HTTP isteğindeki ek bağlam nedeniyle sunucu tarafından reddedilebilir. Sec-Fetch-*
başlıklar.
Sec-Fetch-Site
#
- Chrome 76, Desteklenir 76
- Firefox 90, Desteklenir 90
- Kenar 79, Desteklenen 79
- Safari 16.4, Desteklenir 16.4
Sec-Fetch-Site
sunucuya isteği hangi sitenin gönderdiğini söyler. Tarayıcı bu değeri aşağıdakilerden birine ayarlar:
same-origin
istek kendi uygulamanız tarafından yapıldıysa (örn.site.example
)same-site
istek sitenizin bir alt alanı tarafından yapıldıysa (örn.bar.site.example
)none
istek açıkça bir kullanıcının kullanıcı aracısıyla etkileşiminden kaynaklanıyorsa (örneğin, bir yer imine tıklamak)cross-site
istek başka bir web sitesi tarafından gönderilmişse (örn.evil.example
)
Sec-Fetch-Mode
#
Sec-Fetch-Mode
gösterir mod talebin Bu kabaca talebin türüne karşılık gelir ve kaynak yüklerini gezinme taleplerinden ayırmanıza olanak tanır. Örneğin, bir hedef navigate
üst düzey bir gezinme isteğini belirtirken no-cors
resim yükleme gibi kaynak isteklerini gösterir.
Sec-Fetch-Dest
#
- Chrome 80, Desteklenir 80
- Firefox 90, Desteklenir 90
- Kenar 80, Desteklenen 80
- Safari 16.4, Desteklenir 16.4
Sec-Fetch-Dest
bir isteği ortaya çıkarır varış noktası (örneğin eğer bir script
veya bir img
etiketi, tarayıcı tarafından bir kaynağın istenmesine neden oldu).
Bu istek başlıklarının sağladığı ek bilgiler oldukça basittir, ancak ek bağlam, sunucu tarafında yalnızca birkaç satır kodla Kaynak İzolasyon Politikası olarak da adlandırılan güçlü güvenlik mantığı oluşturmanıza olanak tanır.
Kaynak İzolasyon Politikası Uygulama #
Kaynak İzolasyon Politikası, kaynaklarınızın harici web siteleri tarafından talep edilmesini engeller. Bu tür trafiğin engellenmesi, CSRF, XSSI, zamanlama saldırıları ve kaynaklar arası bilgi sızıntıları gibi yaygın siteler arası web güvenlik açıklarını azaltır. Bu politika, uygulamanızın tüm uç noktaları için etkinleştirilebilir ve kendi uygulamanızdan gelen tüm kaynak isteklerinin yanı sıra doğrudan gezinmelere (bir HTTP aracılığıyla) izin verir. GET
rica etmek). Siteler arası bağlamda yüklenmesi gereken uç noktalar (örn. CORS kullanılarak yüklenen uç noktalar) bu mantığın dışında bırakılabilir.
1. Adım: Fetch Metadata göndermeyen tarayıcılardan gelen isteklere izin verin #
Tüm tarayıcılar Fetch Metadata’yı desteklemediğinden, ayarlanmayan isteklere izin vermeniz gerekir. Sec-Fetch-*
var olup olmadığını kontrol ederek başlıkları sec-fetch-site
.
if not req['sec-fetch-site']:
return True # Allow this request
2. Adım: Aynı site ve tarayıcı tarafından başlatılan isteklere izin verin #
Kaynaklar arası bir bağlamdan kaynaklanmayan tüm istekler (örneğin evil.example
) izin verilecek. Özellikle, bunlar şu taleplerdir:
- Kendi uygulamanızdan kaynaklanır (örn. aynı kaynaklı bir istek, burada
site.example
isteklersite.example/foo.json
her zaman izin verilecektir). - Alt alan adlarınızdan kaynaklanır.
- Açıkça bir kullanıcının kullanıcı aracısı ile etkileşiminden kaynaklanır (örn. doğrudan gezinme veya bir yer imine tıklama vb.).
if req['sec-fetch-site'] in ('same-origin', 'same-site', 'none'):
return True # Allow this request
3. Adım: Basit üst düzey gezinmeye ve iç çerçevelemeye izin verin #
Sitenizin diğer sitelerden bağlantı almaya devam edebilmesini sağlamak için, basit (HTTP GET
) üst düzey gezinme.
if req['sec-fetch-mode'] == 'navigate' and req.method == 'GET'
# <object> and <embed> send navigation requests, which we disallow.
and req['sec-fetch-dest'] not in ('object', 'embed'):
return True # Allow this request
4. Adım: Siteler arası trafiğe hizmet vermesi amaçlanan uç noktaları devre dışı bırakın (İsteğe bağlı) #
Bazı durumlarda, uygulamanız siteler arası yüklenmesi amaçlanan kaynaklar sağlayabilir. Bu kaynakların yol başına veya uç nokta bazında muaf tutulması gerekir. Bu tür son noktalara örnekler:
- Kaynaklar arası erişilmesi amaçlanan uç noktalar: Uygulamanız,
CORS
etkinleştirildiyse, bu uç noktalara yönelik siteler arası isteklerin hâlâ mümkün olduğundan emin olmak için bunları açıkça kaynak izolasyonundan devre dışı bırakmanız gerekir. - Genel kaynaklar (ör. resimler, stiller, vb.): Diğer sitelerden çapraz kaynak olarak yüklenebilir olması gereken tüm genel ve kimliği doğrulanmamış kaynaklar da muaf tutulabilir.
if req.path in ('/my_CORS_endpoint', '/favicon.png'):
return True
5. Adım: Siteler arası olan ve gezinme amaçlı olmayan diğer tüm istekleri reddedin #
başka siteler arası istek, bu Kaynak İzolasyon Politikası tarafından reddedilecek ve böylece uygulamanızı yaygın siteler arası saldırılardan koruyacaktır.
Örnek: Aşağıdaki kod, basit gezinme isteklerine izin verirken potansiyel olarak kötü amaçlı siteler arası kaynak isteklerini reddetmek için sunucuda veya bir ara yazılım olarak sağlam bir Kaynak İzolasyon Politikasının eksiksiz bir şekilde uygulanmasını gösterir:
# Reject cross-origin requests to protect from CSRF, XSSI, and other bugs
def allow_request(req):
# Allow requests from browsers which don't send Fetch Metadata
if not req['sec-fetch-site']:
return True# Allow same-site and browser-initiated requests
if req['sec-fetch-site'] in ('same-origin', 'same-site', 'none'):
return True
# Allow simple top-level navigations except <object> and <embed>
if req['sec-fetch-mode'] == 'navigate' and req.method == 'GET'
and req['sec-fetch-dest'] not in ('object', 'embed'):
return True
# [OPTIONAL] Exempt paths/endpoints meant to be served cross-origin.
if req.path in ('/my_CORS_endpoint', '/favicon.png'):
return True
# Reject all other requests that are cross-site and not navigational
return False
Kaynak İzolasyon Politikası Dağıtma #
- Sitenizin nasıl davrandığını günlüğe kaydetmek ve izlemek ve kısıtlamaların herhangi bir yasal trafiği etkilemediğinden emin olmak için yukarıdaki kod parçacığı gibi bir modül yükleyin.
- Kaynaklar arası meşru uç noktaları hariç tutarak potansiyel ihlalleri düzeltin.
- Uyumlu olmayan istekleri bırakarak politikayı zorunlu kılın.
Politika ihlallerini belirleme ve düzeltme #
Politikanızı, önce sunucu tarafı kodunuzda raporlama modunda etkinleştirerek yan etkisiz bir şekilde test etmeniz önerilir. Alternatif olarak, bu mantığı ara yazılımda veya üretim trafiğine uygulandığında politikanızın üretebileceği tüm ihlalleri günlüğe kaydeden bir ters proxy’de uygulayabilirsiniz.
Google’da Meta Verileri Getir Kaynak İzolasyon Politikasını kullanıma sunma deneyimimize göre, çoğu uygulama varsayılan olarak bu tür bir politikayla uyumludur ve siteler arası trafiğe izin vermek için uç noktaların muaf tutulmasını nadiren gerektirir.
Bir Kaynak İzolasyon Politikasını Zorlama #
Politikanızın meşru üretim trafiğini etkilemediğini kontrol ettikten sonra, diğer sitelerin kaynaklarınızı isteyemeyeceğini garanti ederek ve kullanıcılarınızı siteler arası saldırılardan koruyarak kısıtlamaları uygulamaya hazırsınız.