10.12. CORS ve CSRF¶
CORS ve CSRF, açık internete bakan bir kameranın HTTPS ve oturum açmanın yanında ihtiyaç duyduğu iki tarayıcı tarafı korumadır. Her biri kurulum için birkaç satır gerektirir. Aşağıdaki bölümler terimi tanımlar ve microdot entegrasyonunu gösterir.
10.12.1. CORS ne yapar¶
Çapraz Kaynak Kaynak Paylaşımı (CORS), bir sunucunun belirli diğer kaynakların yanıtlarını okumasına izin vermek için tercihte bulunmasını sağlayan tarayıcı mekanizmasıdır. Tarayıcının varsayılan aynı kaynak ilkesi bu okumayı engeller: https://example.com üzerindeki JavaScript, https://yard-cam.example.com adresinden gelen yanıtları okuyamaz, çünkü farklı ana bilgisayar farklı kaynak sayılır. CORS, seçilen eşler için istisnalar tanımanın sunucu tarafındaki yoludur.
Pano kameranın kendisinden sunuluyorsa, her istek aynı kaynaktır ve CORS hiçbir şey yapmaz. Kurulum, pano başka bir yerde bulunduğunda önemlidir; https://yard-cam.example.com adresindeki bir kamerayla konuşan https://app.example.com gibi genel bir URL:
from microdot.cors import CORS
cors = CORS(
app,
allowed_origins=['https://app.example.com'],
allow_credentials=True,
max_age=86400,
)
allowed_origins, kameranın yanıtlarını okumasına izin verilen kaynakların listesidir. Panonun kaynağı ve yalnızca panonun kaynağı – * değil – böylece üçüncü taraf bir site kameranın yanıtlarını yanlışlıkla okuyamaz.
allow_credentials=True, çapraz kaynak isteklerinin oturum çerezini içermesine izin verir; bu, panonun bir kaynak sınırı boyunca oturum açmış kalması için ihtiyaç duyduğu şeydir.
max_age=86400, tarayıcıya ön kontrol sonucunu bir gün boyunca önbelleğe alabileceğini söyler. Tarayıcılar, GET/HEAD/POST dışındaki yöntemleri kullanan veya özel başlıklar gönderen her çapraz kaynak çağrısından önce ekstra bir OPTIONS isteği gönderir; max_age bu ek yükü rota başına günde bir ön kontrole indirir.
10.12.2. CSRF ne yapar¶
Siteler Arası İstek Sahteciliği (CSRF), kötü amaçlı bir sayfanın kullanıcının tarayıcısına güvenilir bir sunucuya kimliği doğrulanmış bir istek göndertmesi saldırısıdır. CORS yürürlükte olsa bile, evil.com üzerindeki https://yard-cam.example.com/config adresine POST yapan gizli bir <form> kameraya ulaşır ve tarayıcı kameranın oturum çerezini ekler – çerezler isteği yapan sayfanın kaynağını değil, hedef ana bilgisayarı takip eder – böylece kamera POST’u sanki sahibinden geliyormuş gibi memnuniyetle işler.
CSRF koruması bu istekleri reddeder. microdot.csrf.CSRF, durum değiştiren her istekteki Sec-Fetch-Site başlığını inceleyen ve same-origin olarak etiketlenmemiş (veya CORS tarafından izin verilen bir kaynaktan gelmeyen) her şeyi reddeden ara yazılım ekler:
from microdot.csrf import CSRF
CSRF(app, cors=cors)
cors örneğini geçirmek, ara yazılımın panonun izin verilen kaynağını miras almasını sağlar; kamera çapraz kaynak olsalar bile pano POST’larını yine de kabul eder.
Sec-Fetch-Site modern tarayıcılar tarafından otomatik olarak ayarlanır; kameranın istemci tarafında hiçbir şey yapması gerekmez. Başlığı göndermeyen eski tarayıcılar için CORS izin listesi yedek kontroldür.
10.12.3. Web kancalarının muaf tutulması¶
Kameranın üçüncü taraf bir bulut hizmetinden POST kabul etmesi için bir web kancası uç noktasına ihtiyacı varsa – örneğin arşiv sağlayıcısından bir geri çağırma – rotayı @csrf.exempt olarak işaretleyin, böylece ara yazılım onu geçirir. İşleyici, isteği başka bir yolla doğrulamaktan sorumludur – genellikle yük üzerinde, kameranın ve üçüncü tarafın paylaştığı bir gizli anahtarla hesaplanan bir Hash Tabanlı Mesaj Kimlik Doğrulama Kodu (HMAC); bu, isteğin gizli anahtarı bilen birinden geldiğini kanıtlar. Arka bahçe kamerasında bunların hiçbiri yoktur, ancak ihtiyacınız olduğunda dekoratör oradadır.
10.12.4. Dört satırlık temel yapı¶
HTTPS yürürlüğe girdiğinde, internete bakan herhangi bir kamera dağıtımı için önerilen yığın şudur:
Session(app, secret_key=SECRET,
cookie_options={'http_only': True, 'secure': True})
login = Login()
cors = CORS(app, allowed_origins=[...], allow_credentials=True)
CSRF(app, cors=cors)
Bölümün başındaki oturum ve oturum açma, burada CORS ve CSRF, önceki konudan HTTPS. Dört parça birbirinin üzerine yığılır ve her rotanın yolundan uzak durur.
Kamera artık açık internete bakacak kadar güvenlidir – HTTPS, oturum açma, CSRF, CORS.