İçeriğe geç
Batuhan YAZICI

Senior Cyber Security Specialist

Senior System and Network Admin

Batuhan YAZICI

Senior Cyber Security Specialist

Senior System and Network Admin

Finansal sistemlerde güvenlik,
altyapıda süreklilik.

  • Fortinet
  • SIEM
  • PCI DSS
  • ISO/IEC 27001
← Teknik blog
MagicMirror Projesi · Web ve Uygulama Güvenliği

MagicMirror Projesi: kamera akışı, yerel algılama ve kapanış

Batuhan YAZICI · · 11 dk okuma
MagicMirror Projesi: kamera akışı, yerel algılama ve kapanış — Batuhan YAZICI
Batuhan YAZICI · batuhanyazici.com

MagicMirror Projesi: kamera akışı, yerel algılama ve kapanış kapsamında kaynakta uygulanan bileşenler, doğrulama sınırları ve geri dönüş.

MagicMirror Projesi’nde kamerayı yerel algılama, anlık önizleme ve talep üzerine görsel değerlendirme için ayrı tüketim yollarıyla ele aldık. Kamera yöneticisinde akışın durdurulması ve bekleyen işlemlerin yaşam döngüsü için düzenlemeler yaptık. Bu yazıda gerçek yüz, kimlik özniteliği, ev görüntüsü veya cihaz tanımlayıcısı gösterilmiyor.

Projede yaptığımız düzenleme

Kaynakta kamera yöneticisinin durdurma yolunda açık akışın track nesnelerini kapatan adımlar bulunuyor. Kamera yanıtlarında da istek kimliği ve iptal sinyali kullanılıyor; uykuya geçildikten veya yeni soru geldikten sonra eski görsel yanıtın konuşmaya dönüşmesini önleyen düzenlemeler kararlılık kaydında anlatılıyor. Bu, tarayıcının ve bütün diğer tüketicilerin kamerayı bıraktığını fiziksel olarak yeniden doğruladığımız anlamına gelmiyor.

Yerel önizlemeyi ve algılama özetini bellek üzerinden sunan yol, RuView panelindeki sensör bağlamından ayrı tutuldu. Radyo verisi yüz kimliği veya mimik kaynağı sayılmıyor. Yerel kimlik hattının eşleşme üretmesi de her sonuçta güvenilir kimlik doğrulaması olarak kabul edilmiyor. Aşağıdaki yaşam döngüsü kontrolleri, uygulanmış kodla sınırlı gözlemleri ayırarak bu tasarımın nasıl kabul edileceğini açıklıyor.

İzin, kullanım amacı ve aktarımı ayrı düşünün

MDN'ye göre getUserMedia güvenli bağlam ve kullanıcı izni gibi koşullara bağlıdır. Kurulu tarayıcının izin modeli ve kiosk ayarları ayrıca değerlendirilmelidir. Tarayıcının verdiği cihaz izni uygulamanın saklama ve dış aktarım politikasını kullanıcıya kendiliğinden anlatmaz. Kamera etkinliği görünür bir durumla belirtilmeli; görüntü talebinin ne işe yaradığı anlaşılmalıdır. HTTPS kullanılması gereksiz görüntü toplamayı haklı çıkarmaz.

Kabul tasarımında yerel analiz, dış değerlendirme ve kalıcı saklama için üç ayrı satır açın. Her satırın tetikleyicisi ve durdurma koşulu belli olsun. Tek kare gönderimi, sürekli video gönderimine göre farklı bir kapsamdır; fakat kare yine kişisel ayrıntı içerebilir. Görüş alanındaki başka kişiler, ekranlar ve belgeler de değerlendirilmelidir. Gerçek görüntü yerine sentetik bir test kartıyla aktarım yolunu doğrulamak başlangıç için daha uygundur.

Kameranın edinilmesi, bir karenin dış hizmete gönderilmesi ve akışın kapatılması üç ayrı karardır. Görüntüyü saklamak bunlardan bağımsız bir işlemdir.

  1. İzin ve amacı göster
  2. Gerekli akışı edin
  3. Kare aktarımını ayrıca seç
  4. Bütün sahipleri kapat
  5. Yeniden açılışı doğrula
Kameranın edinilmesi, bir karenin dış hizmete gönderilmesi ve akışın kapatılması üç ayrı karardır. Görüntüyü saklamak bunlardan bağımsız bir işlemdir.

Akışın birden fazla sahibi olabilir

Arayüz önizlemesi, yerel algılama ve fotoğraf isteği aynı kamera kaynağından yararlanabilir. Her tüketicinin ayrı akış açması kaynak kullanımını ve kapanış davranışını karmaşıklaştırabilir. Paylaşılan akış tercih edilecekse hangi bileşenin sahibi olduğu ve son tüketici ayrıldığında ne olacağı açıkça tanımlanmalıdır. Bu bir tasarım önerisidir; bütün tarayıcı ve kamera sürücülerinin aynı davranacağı varsayılmamalıdır.

Bir bileşenin kendi track nesnesini durdurması başka bir track aynı kaynağı kullanıyorsa donanımı hemen kapatmayabilir. MDN stop belgesi bu ayrımı özellikle açıklar. Bu nedenle yalnızca bir nesnenin readyState değerini görmek bütün uygulamanın kamerayı bıraktığını kanıtlamaz. Açık tüketicileri, başka sekmeleri ve yeniden bağlanma işlemlerini de hesaba katın. Görünür arayüz durumu kaynak sahipliğiyle tutarlı olmalıdır.

Kapanışı bütün olay yollarında tasarlayın

Normal çıkış, uykuya geçiş, izin iptali, kamera bağlantısının kaybı ve sayfanın yeniden kurulması için ayrı kapanış yolları belirleyin. İşlev devre dışı bırakıldığında bekleyen tek kare isteği daha sonra kendiliğinden çalışmamalıdır. Geç gelen izin sonucuyla yeni bir akış açılması da değerlendirilmelidir. İstek başladıktan sonra kullanıcı vazgeçerse edinilen kaynağı serbest bırakacak bir sahiplik denetimi gerekir.

Stop çağrısından sonra ilgili track durumunun ended olması beklenir; ancak aynı çağrının ended olayını otomatik üreteceğini varsaymayın. Temizlik mantığını yalnız bu olaya bağlamak eksik bırakabilir. Video öğesinin kaynak bağlantısını ayırmak, zamanlayıcıları ve işleme döngülerini sonlandırmak da ele alınmalıdır. Yalnız CSS ile gizlemek veya kare hızını azaltmak, kamerayı bırakmakla aynı teknik işlem değildir.

Test kanıtı ve geri dönüş

Laboratuvarda gerçek insan görüntüsü kullanmadan izin reddi, yeniden izin, modül açma kapama ve iki tüketicili kullanım senaryolarını sınayın. Her senaryoda açık track sayısı, uygulama durumu ve beklenen aktarım birlikte kontrol edilsin. Gösterge ışığı yararlı bir gözlemdir; donanım ve tarayıcı davranışıyla birlikte yorumlanmalıdır. Tek bir göstergeye dayanarak kayıt veya ağ aktarımı olmadığı sonucunu çıkarmayın.

Geri dönüşte önceki kamera yönetim sürümünü geri alın ve eski oturumdan kalan bütün tüketicileri kontrollü kapatın. Temiz oturumda izin, yerel işleme ve kapanış kabulünü yeniden yürütün. Önceden kaydedilmiş veya gönderilmiş görüntülerin silinmesi ayrı bir iş akışıdır; akışı durdurmak bunu gerçekleştirmez. Bu yazı performans veya yüz tanıma doğruluğu raporu değildir; kamera kaynağının ve veri sınırının açık biçimde yönetilmesine odaklanır.

Serinin bütün çalışmaları: MagicMirror Projesi.

Nasıl yapılır: ayrıntılı uygulama

Ortam ve ön koşullar: Tarayıcı kamera yaşam döngüsü örneği — HTTPS/güvenli bağlam ve kullanıcı kamera izni gerekir; örnek yerel test içindir.

  1. Güvenli bağlam ve izinli test sayfasını hazırlayın
  2. Video ve düğmeleri oluşturun
  3. Geç gelen izin sonucunu da kapatan yöneticiyi yazın
  4. Normal ve yarış durumunu test edin
  5. Algılama ve geri dönüş sınırını koruyun

1. Güvenli bağlam ve izinli test sayfasını hazırlayın

Tarayıcı camera API’si HTTPS veya desteklenen localhost güvenli bağlamı ve kullanıcı izni ister. Bu örnek yalnız yerel video yaşam döngüsüdür; gerçek yüz/ev görüntüsü sunucuya gönderilmez.

2. Video ve düğmeleri oluşturun

Yeni kamera-test.html dosyasına HTML parçasını ekleyin; aşağıdaki JS aynı dosyada script içine veya camera.js olarak bağlanır. Gizli otomatik kamera başlatılmaz.

<button id="kamera-ac" type="button">Kamerayı aç</button>
<button id="kamera-kapat" type="button">Kapat</button>
<p id="kamera-durum" role="status"></p>
<video id="kamera" autoplay muted playsinline></video>
<script src="camera.js"></script>

3. Geç gelen izin sonucunu da kapatan yöneticiyi yazın

camera.js dosyası aşağıdadır. close çağrısı pending getUserMedia sonucunu iptal etmese bile generation kontrolü sonradan gelen stream’in bütün track’lerini durdurur. HTML’ye içeriği textContent ile yazılır.

const video = document.getElementById("kamera");
const status = document.getElementById("kamera-durum");
let stream = null, generation = 0;
function closeCamera() {
  generation++;
  stream?.getTracks().forEach(track => track.stop());
  stream = null;
  video.srcObject = null;
  status.textContent = "Kapalı";
}
async function openCamera() {
  closeCamera();
  const mine = generation;
  status.textContent = "İzin bekleniyor";
  try {
    const next = await navigator.mediaDevices.getUserMedia({video:true,audio:false});
    if (mine !== generation) { next.getTracks().forEach(t => t.stop()); return; }
    stream = next;
    video.srcObject = next;
    status.textContent = "Yerel önizleme açık";
  } catch (error) {
    if (mine === generation) status.textContent = "Kamera açılamadı: " + error.name;
  }
}
document.getElementById("kamera-ac").addEventListener("click", openCamera);
document.getElementById("kamera-kapat").addEventListener("click", closeCamera);
window.addEventListener("pagehide", closeCamera);

4. Normal ve yarış durumunu test edin

İzin ver, izin reddet, aygıt yok, açmayı beklerken kapat, art arda aç/kapat ve sayfadan çıkma durumlarını deneyin. Kapatma sonrası kamera göstergesi/track readyState sona ermeli; yalnız video elementini gizlemek kamera kapatma değildir.

5. Algılama ve geri dönüş sınırını koruyun

Projede frame örnekleme/algılama tüketicileri ayrı iptal sözleşmesine bağlanır; bu preview kodu onları kurmaz veya kimlik çıkarımı yapmaz. Test sayfasını kapatıp önceki modül sürümüne dönün; snapshot veya biyometrik çıktı yayımlamayın.

Beklenen sonuç: Kullanıcı izniyle açılan akış kapatmada veya geç sonuçta bütün track’leriyle durur.

Sonuç farklıysa: Fonksiyon hata verirse kullanıcı izni ve güvenli bağlamı kontrol edin; sessizce kayıt başlatmayın.

Geri dönüş: Yeni kamera tüketicisini durdurup önceki sahiplik/yeniden bağlanma davranışına dönün.

MagicMirror Projesi: kamera akışı, yerel algılama ve kapanış için temsili uygulama ve kabul haritası
Temsili uygulama ve kabul haritası; gerçek ürün ekran görüntüsü değildir. Haritayı büyük aç.

Kaynaklar

Uygulama örnekleri teknik, kaynak ve mahremiyet incelemesinden geçti. Temsili haritalar üretici ekran görüntüsü veya canlı sistem testi olarak sunulmaz. Kullanılan ürün sürümü ve kapsam uygulama öncesinde doğrulanmalıdır.

Batuhan YAZICI

Senior Cyber Security Specialist · Altyapı ve güvenlik üzerine teknik notlar.

Okumaya devam edin

MagicMirror Projesi — Batuhan YAZICI