Bluesky’de barındırılan web sitesi
(danielmangum.com)- Daniel Mangum, AT Protocol’ün blob yükleme ve kayıt referansı yapısını kullanarak Bluesky PDS’ye yüklenen
text/htmldosyalarının tarayıcıda açılan bir web sayfası gibi sunulabildiğini gösterdi - Temel işleyiş şu: Yüklenen blob hemen herkese açık olmuyor; bir record’un blob’a referans vermesi gerekiyor ki PDS onu herkese açık erişilebilir duruma çevirsin
- Standart Bluesky görsel embed’i yalnızca
image/*MIME türlerine izin veriyor; ancak bilinmeyen bir lexicon’a ait record veya open union tabanlı özel embed,text/htmlblob referansını saklayabiliyor getBlobkimlik doğrulama olmadan erişilebilir;bsky.socialistekleri gerçek PDS olanporcini.us-east.host.bsky.networkadresine yönlendirilerek HTML döndürüyor- Bluesky,
getBlobiçin CSP başlığı venosniffuyguluyor ve varsayılan blob yüklemelerini 5 MB ile sınırlıyor; ancak PDS işletme hizmetleri için keyfi dosya barındırma ile depolama ve aktarım maliyeti yükü devam ediyor
AT Protocol blob’u ile web sitesi yükleme yöntemi
- Bu örnek, Bluesky uygulamasının standart özelliklerinden ziyade AT Protocol ve PDS API’nin çalışma biçimine dayanıyor
- Bluesky, kullanıcının PDS’sine erişen bir PDS entryway sunuyor ve birden fazla PDS örneğini
bsky.socialalan adı üzerinden dışa açıyor - Tekil PDS örneklerine doğrudan da erişilebiliyor; örnek web sitesi
porcini.us-east.host.bsky.networküzerindekicom.atproto.sync.getBlobuç noktasında açılıyor - Yazı yayımlanmadan önce Bluesky ekibiyle iletişim kuruldu; bu davranış amaçlanan bir uygulama kullanım biçimi olmasa da bilinen bir davranış ve bir güvenlik açığı bildirim süreci değil
records ve blobs neden ayrılıyor?
- AT Protocol’de uygulama verileri kabaca records ve blobs olarak ikiye ayrılıyor
- records, kullanıcıların oluşturduğu temel varlıklardır; yapı ve meta veriler içerebilir
- blobs, görseller gibi daha büyük, yapılandırılmamış verilerdir; genellikle görünür olmaları için bir record tarafından referans verilmesi gerekir
- Bluesky’de görsel içeren bir gönderi oluşturmak kullanıcıya tek bir işlem gibi görünse de API düzeyinde blob yükleme ve record oluşturma ayrı işlemlerdir
- blob specification’a göre blob, bir record tarafından referans verilmeden önce PDS’ye yüklenmelidir
- Sunucu yükleme anında blob’un hangi Lexicon’da kullanılacağını bilemez; bu yüzden ilk yükleme sırasında yalnızca genel blob sınırlamalarını uygular, Lexicon tabanlı sınırlamaları ise record oluşturma anında uygular
- Başarıyla yüklenen blob geçici depoya girer; bu durumdayken indirilemez veya dağıtılamaz ve
listBlobsçıktısına da dahil edilmez - Record oluşturma başarılı olur ve ilgili record blob’a referans verirse sunucu blob’u herkese açık erişilebilir duruma geçirir
HTML blob yükleme ve herkese açık duruma geçirme
- Kimlik doğrulama token’ı, kullanıcı kimlik bilgilerinin
com.atproto.server.createSessionXRPC yöntemiyle takas edilmesiyle alınır - Örnekte mevcut blob sayısı
com.atproto.sync.listBlobsile kontrol edildi; yükleme öncesi sayı391idi - Web sitesinin gövdesi basit bir
index.htmldosyasıdır vecom.atproto.repo.uploadBlobile yüklenmiştirContent-Type:text/html- Dönen blob meta verileri CID
bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq,mimeType: text/htmlvesize: 268içerir
- Yüklemenin hemen ardından
com.atproto.sync.getBlobile alınmaya çalışıldığında erişilemedi;listBlobssayısı da391olarak kaldı - HTML blob’u bir Bluesky gönderisinin görsel embed’i olarak referans vermek,
app.bsky.embed.imageşemasıimage/*MIME türü istediği için başarısız olurtext/htmlolduğu gibi bırakılırsaWrong type of file. It is text/html but it must match image/*.hatası oluşurmimeTypeimage/jpegolarak değiştirilirse depolanan blob MIME türü ile referanstaki MIME türünün farklı olduğuna dair hata oluşur
Bilinmeyen lexicon record’u ile blob’u herkese açmak
- Blob türü Bluesky’ye özgü değildir; AT Protocol veri modelinin bir parçasıdır
- Bluesky PDS implementasyonu açık kaynaklıdır ve
findBlobRefs,LexValueiçinde özyinelemeli arama yaparak$type: blobreferanslarını bulur - PDS’nin zaman içinde yeni lexicon’ları desteklemesi gerektiğinden, bilmediği lexicon’ları da işleyebilmesi gerekir
com.danielmangum.hack.websitetüründe bir record oluşturulup HTML blob’a referans verildiğinde PDS record’u kaydetti- Yanıtta
validationStatus: unknownyer aldı - PDS
com.danielmangum.hack.*lexicon’unu bilmediği için doğrulama yapamadı, ancak record’un kaydedilmesine izin verildi
- Yanıtta
- Sonrasında
listBlobssayısının392ye yükselmesiyle blob’un kalıcı olarak saklandığı doğrulandı getBlobkimlik doğrulama token’ı olmadan çağrılabilir; çünkü records ile birlikte blobs’u işlemesi gereken kimliği doğrulanmamış tarafların da blob’u alabilmesi gerekirbsky.socialüzerinden yapılangetBlobçağrısı, 302 yönlendirmesiyle gerçek PDS URL’sini döndürdü;-Lile yönlendirme takip edildiğinde HTML içeriği olduğu gibi döndü
Güvenlik başlıkları, CDN ve doğrudan erişimin yükü
- AT Protocol blob spesifikasyonundaki Security Considerations, keyfi kullanıcı yüklemeli dosyaların web sunucusundan sunulmasıyla doğan içerik güvenliği risklerini ele alır
- Tipik örnek, aynı origin üzerinde script veya SVG içeriğinin çalıştırılmasıyla oluşan XSS sorunudur
getBlobuç noktasında Content Security Policy uygulanması fiilen zorunludur- Blob deposunu tarayıcılara ve web ajanlarına doğrudan sunma yöntemi pratikte desteklenmez; uygulamalar bağımsız CDN, proxy, web servisi vb. üzerinden geçmelidir
- Bluesky PDS’nin
getBlobhandler’ı önerilen güvenlik başlıklarını uygularx-content-type-options: nosniffcontent-security-policy: default-src 'none'; sandbox
- Varsayılan blob yükleme sınırı 5 MB’tır
- Bluesky uygulamasındaki standart görsel blob’ları PDS’den doğrudan sunulmaz;
cdn.bsky.appüzerindeki CDN URL’leriyle sunulur- Feed küçük görsel URL’si ve tam boy URL ayrı ayrı bulunur
- Gönderi record’u görsel CID’sini içerir ve uygulamanın CDN üzerinden sunma yöntemini bilmesi gerekir
getBlobdoğrudan erişimi, GitHub issue’sunda görsel etiketleme, kullanıcı içeriği export’u ve gelecekteki kullanım durumları nedeniyle korunmuştur- Aynı tartışmada kullanıcıların içeriği hotlink etme veya Bluesky’yi ücretsiz barındırma gibi kullanma ihtimali de yer alır
- İlk implementasyonda güvenlik başlıkları yoktu; daha sonra eklendi
- Geleneksel sosyal platformlarda geçerli içerik türleri sınırlı olduğundan yükleme anında blob daha güçlü şekilde kısıtlanabilir; ancak Bluesky ve AT Protocol’ün genişletilebilirliği daha karmaşık işlem gerektirir
open union ile gönderiye özel embed eklemek
app.bsky.feed.posttürü, geçerli embed listesini union olarak tanımlar- AT Protocol lexicon’unda union, açıkça
closeddeğilse varsayılan olarak open olur- Gelecekteki şema revizyonlarında tür eklenebileceğinden implementasyonların doğrulama sırasında hoşgörülü olması gerekir
closedbayrağı varsa tür kümesi sabitlenir
- Bluesky gönderisinin embed union’ı
closedolarak işaretlenmiş değildir - Bu nedenle listelenmemiş bir embed
$typeile de gönderi oluşturulabilir - Örnekte
app.bsky.feed.postrecord’u içinecom.danielmangum.hack.sitesembed’i eklenmiş ve onun içinde HTML blob’a referans verilmiştir- Yanıttaki
validationStatus:valid - Bluesky uygulamasında ilgili embed sessizce yok sayılır
- İçerik ve referans record’da kalıcı olarak saklandığından başka uygulamalar bu embed’i render edebilir
- Yanıttaki
- Bu tür lexicon özellikleri, mevcut kullanım senaryolarının üzerine küçük uzantılar ekleme biçiminde değerlendirilebilir; örnek olasılık olarak gönderi içindeki küçük kod parçacıklarının WebAssembly sandbox’ında çalıştırılması verilmiştir
1 yorum
Hacker News yorumları
Daniel’ın ekibe doğrudan sormuş olması sevindiriciydi; blob barındırma, kötüye kullanım yolları daha iyi anlaşıldıkça sürekli ayarlanmak zorunda kalacak bir alan
Şimdilik bu tür kullanımın gerçekten çalıştığını görmek eğlenceli; PDS de bir web sunucusunun web sitesi barındırması gibi veritabanı barındırıcısı olacak şekilde tasarlanmış bir yapı
Eskiden kurcalaması keyifliydi; Bluesky’ye geçtiğini bilmiyordum, oldukça ilginç
Bsky, kullanıcı alan adlarını redirect.bsky.com’a ALIAS olarak bağlama yöntemini zaten destekliyor: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
Bunun hangi güvenlik bağlamında çalıştığını merak ettiğim için PDS blob URL’sini
curlile kontrol ettim; yanıt başlıklarındaaccess-control-allow-origin: *,content-security-policy: default-src 'none'; sandbox,x-content-type-options: nosniffvb. vardıaccess-control-allow-origin: *, herhangi bir alan adındaki web sayfası JavaScript’inin bu içeriğefetch()ile erişebileceği anlamına geldiği için ilginç;default-src 'none'; sandboxise ek script veya görsel yüklenmesini engelleyen ve JavaScript çalıştırılmasını da durduran, çok kısıtlayıcı ve iyi bir ayar: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...ratelimit-limit: 3000muhtemelen IP bazlı bir sınır gibi görünüyorYazının sonunda WebAssembly kullanmayı önermesi doğru yönde; bağlantı tıklama sorunu ise güvenilmeyen kodu iframe’e koyup üst tarafta
child-srcile yalnızca belirli alan adlarına veyadata:ya izin vererek sınırlandırılabilirhttps://github.com/w3c/webappsec/issues/656#issuecomment-246...
https://www.w3.org/TR/CSP3/#exfiltration
sandboxkullanıldığında dadefault-srcgerekli mi, yoksa bu mükerrer ayar mı, merak ediyorumBluesky’yi blob veri deposu olarak kullanma olasılığı beni epey heyecanlandırıyor
Bir arkadaşımla DOOM WAD’lerini Bluesky’de saklayıp gönderi gibi “harita paketleri” paylaşma yöntemini düşündük; hesapları, listeleri ve starter pack’leri takip edince GZDoom gibi istemcileri değiştirip bu hesapların yüklediği WAD’leri arayıp görüntüleyebilir hale getirmek mümkün olabilir
Steam Workshop’a benzer, ama Bluesky üzerinden işleyen bir yöntem
Bluesky’nin blob deposu kullanım yönergelerinden söz edip etmediğini de bilmiyorum; DOOM dosyaları küçük olduğu için iyi bir örnek ama büyük sunucu alanını dışarıya yıkma şeklinde kötüye kullanılabilir mi, onu da merak ediyorum
Bu belirli dönemi yaşamadım ama BlueSky kullanıcılarının teknik açıdan derin sulara atlaması, MySpace’te ilk kez HTML öğrenilen günleri hatırlatıyor
Sosyal medya pazarı eskisine göre çok daha doygun, ama BlueSky’den yeni bir programcı nesli çıkıp çıkmayacağını merak ediyorum
Bluesky yalnızca ilk basamağı sunuyor; sonrasından itibaren ise oldukça büyük bir sıçrama gibi görünüyor
HTTP/HTML söz konusuysa, yalnızca temel Python veya başka bir programlama dili bilen birine bile 14 dakika içinde sıfırdan sunucu yapmayı gösterebilirsiniz
Teknoloji devlerinin toplulukları sömürmesini engellemek için hash adreslemeli iletişim protokolü gerektiğini düşünüyorum; ama AT Protocol’ün HTTP gibi bir devrimi tetikleyecek kadar hedefini iyi tutturup tutturmadığından emin değilim
Burada ele alınan PDS’nin Bluesky ürününün kendisi değil, Personal Data Server’ın bir parçası olması; bunun da sonuçta sınırsız ücretsiz veri deposu gibi görünebilmesi, temel noktalardan biri
Bluesky ekibinin zaman zaman bahsettiği abonelik hizmeti bununla bağlantılı olabilir gibi görünüyor; PDS’de daha fazla alan, bant genişliği ve yüksek kaliteli video sunmak gibi barındırma özellikleri premium katman olarak satmaya uygun duruyor
Başka yerlerde de barındırılabilir olmalı; dolayısıyla Bluesky uygulamasının ötesinde etkileşim kurulabileceği sözü doğru görünüyor
İnternete bir şey yüklemeyi mümkün kıldığınızda, eninde sonunda birilerinin bunun üzerinde rastgele dosya barındırma denemesi olgusunun bir adı olması gerekiyor gibi görünüyor
Sınırsız olduğu dönemlerde dosya sistemini Gmail vb. yerlere yedeklemeye çalışan birkaç açık kaynak proje ortaya çıkmıştı; Drive çıktıktan sonra bu daha da arttı
Ücretsiz hizmetler böyle sorunların çıkacağını öngörüp varsayılan sınırlar koymalı
https://en.wikipedia.org/wiki/Inner-platform_effect
Bu tür konular ilginizi çekiyorsa atfile da bakmaya değer: https://github.com/electricduck/atfile
Oldukça havalı; yazının alt kısmında bağlantısı verilen ilginç GitHub issue’sunu hemen görebiliyorsunuz
Bluesky’nin tanınmış isimlerinden pfrazee de görünüyor: https://github.com/bluesky-social/atproto/issues/523
AT’den beklentim yüksek; Fediverse’te harika işler yapmış pek çok zeki insan da vardır elbette, ama bu paradigma daha sürdürülebilir ve pratik görünüyor
Temelde merkezi olarak sunulup, gerektiğinde ya da ileri düzey kullanıcılara gerçek merkeziyetsizlik desteği verilmesi yaklaşımı
firehose aynalamadan yatırım getirisi elde etmenin bir yoluna ihtiyaç var; örneğin bazı kullanıcıların daha uzun video barındırma ücretini ödediği bir Discord alternatifi, relay’lerin erişim ve şifre çözme anahtarlarını yönetip komisyon aldığı Patreon benzeri bir yapı, Bandcamp tarzı bir sosyal pazar yeri mümkün görünüyor
Sonuçta açık bir platform, şu anda da yapılmaması için bir neden yok
https://www.blockchaincapital.com/blog/bluesky-13m-users-and...
https://bsky.social/about/blog/09-11-2024-video
Bu yöntemin phishing veya kötü amaçlı yazılım dağıtımı için suistimal edileceği hissi uyandırmıyor mu?
Bir hosting sitesi yaparsanız birilerinin onu kötü niyetli amaçlarla kullanmaya çalışması neredeyse bilişimin bir yasası gibi görünüyor
Matrix ek dosyalarında da aynı sorun vardı
*.bsky.networkGoogle Safe Browsing, Palo Alto, Bluecoat vb. tarafından engellenmeye başlar gibiBu, yazarın Bluesky sunucusuna, yani PDS’ye giden doğrudan bağlantı; dolayısıyla doğal olarak yazarın kontrolünde
Strava’nın son API değişikliklerini görünce, platformlarında saklanan verilere erişimin ne kadar kısıtlı olduğunu hatırladım
Fitness alanındaki baskın hizmet oldukları için özellikleri kademeli olarak abonelik duvarının arkasına koyabilirler
Gizlilik ya da güvenlik endişeleri olabilir, ama AT Protocol’ün GPX veya FIT dosyaları için bir depolama platformu olarak uygun olup olamayacağını merak ediyorum
Ancak bildiğim kadarıyla AT Protocol henüz özel veya sınırlı erişimli gönderileri desteklemiyor; Strava kullanımında bunun oldukça temel bir özellik olduğunu düşünüyorum