.NET 6 Hot Reload ve Web Sockets nedeniyle “ws: İçerik Güvenliği Politikası yönergesini ihlal ettiği için bağlanmayı reddetti”

In: Genel


hakkında heyecanlıysanız Sıcak Yeniden Yükleme benim gibi VE sen de “A” notu istiyorum itibaren SecurityHeaders.com (gerçekten, şimdi bunu deneyin) o zaman çok hızlı öğreneceksiniz İçerik-Güvenlik-Politikası başlıklar. Okumaya biraz zaman ayırmanız gerekiyor ve sonunda izin verilen şeyler, komut dosyaları, stil sayfaları vb. gibi karmaşık bir listeyle karşılaşabilirsiniz.

İçinde DasBlog Çekirdeği (bu blogu çalıştıran platformlar arası blog motoru) Mark Downie bunları yapılandırılabilir hale getirir ve gerekli başlıkları eklemek için NWebSpec ASP.NET Ara Yazılım kitaplığını kullanır.

if (SecurityStyleSources != null && SecurityScriptSources != null && DefaultSources != null)
{
app.UseCsp(options => options
.DefaultSources(s => s.Self()
.CustomSources(DefaultSources)
)
.StyleSources(s => s.Self()
.CustomSources(SecurityStyleSources)
.UnsafeInline()
)
.ScriptSources(s => s.Self()
.CustomSources(SecurityScriptSources)
.UnsafeInline()
.UnsafeEval()
)
);
}

Bu değişkenlerin her biri bir yapılandırma dosyasından çıkar. Evet, kasadan çıkmaları veya hatta sabit kodlanmaları daha güvenli olurdu.

DasBlog oldukça büyük ve harika bir uygulama ve Mark’ın onu .NET 6’ya yükseltmesinin hemen ardından Hot Reload’u kullanamadığımızı fark ettik (dotnet watch aracılığıyla veya VS 2022’den). Bundan şikayet edebiliriz veya nasıl çalıştığını ve neden bizim için çalışmadığını öğrenebiliriz!

Unutma: Bilgisayarınızdaki hiçbir şey sizden gizlenmez.

Basit bir “Kaynağı Görüntüle” ile başlayarak, en altta kesinlikle benim olmayan bir JavaScript içermesini görebiliriz!

<script src="http://feeds.hanselman.com/_framework/aspnetcore-browser-refresh.js"></script>

Tamam, bu, HotReload’ın yalnızca C#’ı (arkadaki kodlar) desteklediğini değil, Razor Sayfaları aracılığıyla İşaretlemeyi ve CSS’yi değiştirmeyi de desteklediğini bildiğimiz için mantıklı! Kesinlikle “dotnet watch” veya VS2022 olan koşucuyla “eve” iletişim kurması gerekir.

ASPNETCORE_ENVIRONMENT öğesini “Üretim” olarak değiştirirsem (ya launch.json, launchsettings ya da bunun gibi bir ortam değişkeni aracılığıyla, fazladan HotReload yardımcı komut dosyasının orada olmadığını görebilirim:

C:githubwshotreloadtest>dotnet run --environment="Production"
Building...
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7216
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5216

Unutma: Dotnet run’ı üretimde asla kullanmak istemezsiniz! Bu bir SDK oluşturma komutudur! dotnet exec your.dll, dotnet your.dll veya hepsinden iyisi .NET 6’da kullanmak isteyeceksiniz, sadece doğrudan EXE’yi arayın! .binDebugnet6.0wshotreloadtest.exe örneğimde. Neden? Niye? dotnet run çalıştırırsanız, her zaman Geliştirme aşamasında olduğunu varsayar (kelimenin tam anlamıyla ona tek bir çalıştırma komutunda geri yüklemesini, oluşturmasını ve yürütmesini söylersiniz). Gerçek EXE’yi çalıştırmanın da her zaman ÇOK daha hızlı olduğunu not edeceksiniz! .NET SDK’nızı web sunucunuza göndermeyin ve üretimde başlangıçta her şeyi yeniden derlemeyin!

aspnnetcore-browser-refresh.js öğesinin Development-time HotReload’ın istemci tarafı olduğunu görebiliriz. Tarayıcı konsolumuza baktığımızda şunu görüyoruz:

CSP Yönergesini ihlal ettiği için Bağlanmayı reddetti

Refused to connect to 'wss://localhost:62486/' 
because it violates the following Content Security Policy
directive: "default-src 'self'".
Note that 'connect-src' was not explicitly set,
so 'default-src' is used as a fallback.

Düşünülecek çok şey var. ASP.NET Web Uygulamamın ara yazılımını “kendi kendime” konuşmanın uygun olduğunu, ancak başka hiçbir yerde olmadığını söyleyerek başlattım.

app.UseCsp(options => options.DefaultSources(s => s.Self())); 

Hm, self makul görünüyor, tarayıcı neden dotnet tarafından çalıştırılan Kestrel Web Sunucusuna GERİ bağlanamıyor? Hepsi localhost, değil mi? Eh, özellikle http://localhost ws://localhost değil, hatta wss://localhost (bu fazladan s güvenlidir) bu yüzden ws: veya wss: veya her ikisine açıkça izin vermem gerekiyor, ancak yalnızca Geliştirme aşamasında.

Belki bunun gibi (yine, NWebSpec kullanıyorum, ancak bunlar yalnızca HTTP Başlıklarıdır, yani isterseniz bunları tam anlamıyla ekleyebilirsiniz, sabit kodlu.)

app.UseCsp(options => options.DefaultSources(s => s.Self())
.ConnectSources(s => s.CustomSources("wss://localhost:62895")));

Ama port numaraları değişiyor, değil mi? Sadece wss yapalım:, sadece Geliştirmede. Şimdi, Üretimde hem CSP’leri hem de WebSockets’i (ws:, wss 🙂 kullanıyorsam, bu konuda bilinçli olmam gerekecek.

Ahlaki ne?

İşleri sıkılaştırmak için CSP Başlıklarını kullanmaya başlarsanız, Üretimde ihtiyaç duyabileceğiniz her şeye karşı Geliştirmede Sıcak Yeniden Yükleme gibi kolaylıklar için ihtiyaç duyduğunuz başlıkların bilincinde olun ve bunların farkında olun.

Umarım bu size biraz zaman kazandırmaya yardımcı olur!


Sponsor: Rocket Mortgage®’da burada yaptığınız işler %100 etkili olacak ancak tüm boş zamanınızı almayacak ve size mükemmel bir iş-yaşam dengesi sunacak. Ya da bizim dediğimiz gibi, teknoloji/yaşam dengesi! Daha fazla bilgi edin.




Scott hakkında

Scott Hanselman eski bir profesör, eski finans baş mimarı, şimdi konuşmacı, danışman, baba, diyabetik ve Microsoft çalışanıdır. Başarısız bir stand-up komedyeni, köşe yazarı ve kitap yazarıdır.

Facebook
twitter
abone olmak
Hakkında Bülten

Barındırma Tarafından
Bir Azure Uygulama Hizmetinde barındırılıyor










Bir cevap yazın

Ready to Grow Your Business?

We Serve our Clients’ Best Interests with the Best Marketing Solutions. Find out More

How Can We Help You?

Need to bounce off ideas for an upcoming project or digital campaign? Looking to transform your business with the implementation of full potential digital marketing?

For any career inquiries, please visit our careers page here.
[contact-form-7 404 "Bulunamadı"]