Üye adı, yazılacak yolun tamamı değildir

Ajan bir arşivdeki notları belirlenen klasöre açacak. Üye adlarının çoğu notes/a.txt gibi sıradan görünüyor. Bir tanesi üst dizine çıkan bir yol, diğeri hedefe benzeyen başka klasör içeriyor. “Hedef adıyla başlıyor” kontrolü dosyanın gerçekten izin verilen dizin içinde kalacağını göstermeyebilir. Çıkarma işleminden önce ham üye adıyla hesaplanan hedef yolu yan yana görmek, sınır kontrolünün neyi doğruladığını açık hale getirir.

Bu yazı gerçek arşiv açmaz, dosya oluşturmaz veya sisteminizdeki bağlantıları incelemez. Tamamı sentetik yedi üye adı üzerinde savunma amaçlı karar tablosu hazırlıyoruz. Kullanılan kurallar POSIX tarzı, eğik çizgili sanal bir yol alanına aittir. Windows yolları bu profilin dışında tutulur. Çıktı genel bir güvenli arşiv açıcı değil; çıkarma öncesinde incelenecek bir yol sınırı kaydıdır.

İzinli kökü ve kanıt sınırını belirleyin

İzinli kök /demo/inbox olarak verilmiştir. Hedef, bu klasörün altında bir dosya olmalıdır; kök klasörün kendisi dosya hedefi sayılmaz. Mutlak üye yolları reddedilir. Bu dar profilde ters eğik çizgi veya iki nokta içeren adlar desteklenmez. A1 ve A5 için yol bileşenlerinde sembolik bağlantı bulunmadığı örnek varsayımıdır. A6’daki alias bileşeni için ise bağlantı bilgisi yoktur; belirsizlik açık kalacaktır.

Python belgeleri zipfile.Path nesnesinin arşiv adlarını kendiliğinden temizlemediğini ve çağıranın yol doğrulamasından sorumlu olduğunu belirtir. Aynı açıklama extract ve extractall davranışlarından ayrılır. Dolayısıyla bütün arşiv APIlerini tek davranışmış gibi anlatmak doğru olmaz. Kullandığınız gerçek APIyi ve hangi girdileri normalleştirdiğini ayrıca inceleyin; bu örneğin karar tablosunu o belgenin yerine koymayın.Kaynak: Python — zipfile.Path

Sentetik arşiv üye adları
KimlikHam üye adıBağlantı bilgisi
A1notes/a.txtYok olduğu verilmiş
A2../outside.txtYol dışında
A3../inbox-backup/a.txtYol dışında
A4/tmp/a.txtMutlak yol
A5notes/../a.txtYok olduğu verilmiş
A6alias/a.txtBilinmiyor
A7C:\temp\a.txtDesteklenmeyen yol profili

Karakter öneki ile dizin ilişkisini ayırın

A3 çözümlendiğinde /demo/inbox-backup/a.txt oluşur. Bu metin /demo/inbox karakterleriyle başlar; ancak inbox-backup, inbox klasörünün alt dizini değildir. Python os.path belgeleri de commonprefix işlevinin karakterlere baktığını, commonpath işlevinin ise yol bileşenleri üzerinden ortak yolu verdiğini açıklar. Bileşen ilişkisi, yalnız metnin başını karşılaştırmaktan farklıdır. Platformların yol kuralları da farklı olduğundan kullanılan yol profilini açık tutmak gerekir.Kaynak: Python — os.path commonpath and commonprefix

Elle hazırlanmış sözcüksel yol kararları
KimlikHesaplanan hedef veya engelKarar
A1/demo/inbox/notes/a.txtYol hesabı uygun
A2/demo/outside.txtRet
A3/demo/inbox-backup/a.txtRet
A4Mutlak üye yoluRet
A5/demo/inbox/a.txtYol hesabı uygun
A6/demo/inbox/alias/a.txtBağlantı incelemesi
A7Windows biçimi bu profilde desteklenmiyorRet

A2 üst dizine çıkıp izinli kökün dışında kalır. A4 baştan mutlak yoldur; bu profil onu yeni kök gibi kullanmaz. A7’yi POSIX metni olarak kökün altına eklemek, Windows anlamını doğruladığınız anlamına gelmez; burada açıkça reddedilir. A5 ise verilmiş bağlantısız yol varsayımı altında notes bileşenine girip geri çıkar ve kök altında a.txt hedefini verir. Kayıtlar tek bir “temiz ad” etiketine indirgenmez.

Sözcüksel uygunluk çıkarma onayı değildir

A6 metin hesabında kökün altında görünür. Fakat alias başka bir yere yönelen sembolik bağlantıysa dosyanın fiziksel hedefi değişebilir. Gerçek dosya sistemi bilgisi yokken bu satırı güvenli diye kapatmayın. A5 için de bağlantısızlık varsayımı kaldırılırsa yalnız nokta bileşenlerini sadeleştirmek fiziksel yolu kanıtlamaz. Sözcüksel yol hesabı, isimlerin kurallara göre düzenlenmesidir; gerçek bağlantıların çözümlenmesi ayrı kanıttır.

Gerçek bir çıkarıcıda hedefin dosya sistemi üzerinde nasıl çözüldüğü, bağlantı politikası ve kontrol ile yazma arasında durum değişmesi ayrıca ele alınır. Bir defalık önizleme bunları otomatik sağlamaz. Bu yazının kapsamı dosya boyutu, sıkıştırma oranı veya bütün arşiv türlerinin güvenliği de değildir. Sonucun hangi sınırı kontrol ettiğini açık yazmak, dar bir testin daha geniş işlem yetkisi gibi kullanılmasını önler.

Dosya açmadan karar planı hazırlayın

Kopyalanabilir arşiv yolu denetimi
İzinli sanal POSIX kökü /demo/inbox. A1 notes/a.txt; A2 ../outside.txt; A3 ../inbox-backup/a.txt; A4 /tmp/a.txt; A5 notes/../a.txt; A6 alias/a.txt; A7 C:\temp\a.txt. Mutlak yolları, ters eğik çizgiyi ve iki noktayı bu profilde reddet. Hedef kökün altında dosya olmalı. A1/A5 bileşenleri bağlantısız varsayılmış; A6 bilinmiyor. Her üyenin sözcüksel hedefini ve kararını göster. Karakter önekini dizin ilişkisi sayma. Arşiv açma, dosya yazma veya tam güvenlik onayı üretme.

İstemin sonucunda uygun yol hesabı ile bağlantı incelemesi farklı durumlar olmalıdır. Modelin A6 için bir fiziksel hedef uydurması, kanıtsız tamamlamadır. A3 için ise hedef metnini tam yazmasını isteyin; inbox ve inbox-backup ayrımı böylece kolay görülür. Her kimliğin bir kez bulunması, reddedilen üyelerin sessizce listeden kaybolmaması ve ham adların korunması denetimin temel parçalarıdır.

Açıklamalı beklenen çıktı
Yol hesabı uygun: A1 ve A5, toplam 2.
Ret: A2/A3/A4/A7, toplam 4.
Bağlantı incelemesi: A6, toplam 1.
2+4+1=7 üye. Çıkarılan dosya 0. Uygun sözcüksel yol hesabı gerçek çıkarma işleminin tamamlandığını göstermez.

Kökün kendisini dosya saymayın

Yeni bir A8 üyesinin adı notes/.. olsun. Bağlantısız sanal yol varsayımını koruyarak hedefi hesaplayın. Karakter öneki kontrolü ve ortak yol hesabı kökle eşleşse bile bu üyenin neden dosya hedefi koşulunu karşılamadığını açıklayın. Ardından A6 hakkında bağlantı bilgisi gelmediği halde yalnız adını değiştirmenin incelemeyi neden kapatmayacağını düşünün.

Alıştırmanın cevabı
A8 hedefi /demo/inbox olur. Bu kökün kendisidir; kök altında dosya hedefi koşulunu karşılamaz ve reddedilir. A6’nın fiziksel bağlantı durumu hâlâ bilinmiyor; sözcüksel bir yeniden adlandırma eksik kanıtı tamamlamaz.

İş akışına dönerken araç sahibinden gerçek yol profili, bağlantı politikası ve yazma anındaki sınır kontrolünü isteyin. Bu masabaşı tablosunu sürümü belli bir kabul örneği olarak saklayabilirsiniz. Böylece AI ajanının önerisi, görünüşte düzgün dosya adları üzerinden değil, her adın taşıdığı hedef ve doğrulama durumu üzerinden değerlendirilebilir.

Kaynaklar ve doğrulama

  • Python — zipfile.Path

    zipfile.Path adları kendiliğinden temizlemez; çıkartma APIlerinin davranışıyla aynı kabul edilmemeli, çağıran hedefi doğrulamalıdır.

    Erişim ve kontrol:
  • Python — os.path commonpath and commonprefix

    Karakter öneki ile yol bileşeni ortaklığını ayırma; işletim sistemlerinin yol kuralları farklıdır.

    Erişim ve kontrol:

İlgili okumalar

AI Ajanları ve İş Akışı Otomasyonu

AI Ajanları ve İş Akışı Otomasyonu programında bir dosya işinin izin verilen hedef alanını açıkça tanımlayabilirsiniz. Üye adıyla hedef yolunu yan yana görmek, araca hangi sınırın uygulanacağını tartışmayı sağlar.

  • Kuruma özel planlanır