Blazor WebAssembly とは
Blazor WebAssembly とは、JavaSript を使わずに、C# (.NET) でクライアント Web アプリケーションを実装する技術、ないしはそのようにして作られたクライアント Web アプリケーションです。C# のソースコードを JavaScript にトランスパイルするのではなく、Web ブラウザ内の WebAssembly 上で .NET の MSIL 中間言語のインタープリタを稼働させ、.NET のバイナリファイル (.dll) をブラウザ内でそのまま実行することで実現されています (※近年は MSIL 中間言語バイナリを、さらに WebAssembly ネイティブにコンパイルする AOT 方式も選べるようになっています)。
このような仕組みなので、開発者ツールを開いた Web ブラウザで Blazor WebAssembly で作られたサイトにアクセスすると、その Blazor WebAssembly サイトを構成している .dll ファイル群が次々とブラウザに読み込まれていく様子を見ることができます (下図例。事前 Brotli 圧縮してあるため、拡張子が .dll.br になってますが)。
ウィルス対策ソフトによって読み込みが阻止される!?
しかしです。一部のウィルス対策ソフトやファイヤーウォール製品は、この Blazor WebAssembly サイトへのアクセスを阻止してしまうようです。たしかに、普通は、Web ブラウザによって読み込まれるコンテンツは、HTML や CSS や JavaScript などといったテキストファイル類や、音声、動画、画像類などでしょう。そのような前提のところ、
「拡張子が .dll で、しかも PE ヘッダ付きの、コンテンツ内先頭 2バイトが "MZ" で始まるようなバイナリ実行形式ファイルが、ブラウザによって吸い上げられているだとー!? これ絶対ヤバイって!」
...というような感じに、ウィルス対策ソフトやファイヤーウォール製品によって判断されてしまうようで、結果、アクセスがブロックされてしまうことがあるそうです。
このような環境に向けては、Blazor WebAssembly サイトは供給できないのでしょうか? 諦めて、JavaScript で作り直すしかないのでしょうか? 😥
BlazorWasmAntivirusProtection NuGet パッケージを使えば OK!
幸い、この状況には簡単な回避策があります! "BlazorWasmAntivirusProtection" という NuGet パッケージを、その Blazor WebAssembly プロジェクトに追加すればよいのです。
この NuGet パッケージをプロジェクトに追加してあるだけで、そのプロジェクトを発行すると、発行結果に以下の加工がなされます。
- .dll ファイルの拡張子を .bin に変更
- .dll ファイルの内容を所定のキーバイト列によって XOR 反転
さらに、このように加工された .dll ファイルであっても読み込んで実行できるよう、そのための Blazor WebAssembly のブートローダーもちゃんと自動で構成されます。
結果、各種ウィルス対策ソフトやファイヤーウォール製品は、「なんかよくわからないけど、何かのバイナリデータが流れてるようだな、まぁ、大丈夫っぽいな」と判断してくれるようで、これで無事、Blazor WebAssembly サイトが必要なコンテンツをちゃんと吸い上げて正常稼働できるようになるわけですね。
まとめ
このように、開発者は手放しで、NuGet パッケージを 1 個追加するだけで、Blazor WebAssembly がセキュリティソフトによってマルウェア判定されるのを迂回できるんですね。
幸いにして自分はまだ、このような対策の必要に迫られたことはなく、BlazorWasmAntivirusProtection NuGet パッケージを本格的に使用・利用したことはありません。とはいえ、この先将来、もしかしてもしかすると、お世話になることがあるかもしれませんよね。もしものときに備えて、覚えておきたいと思います。