とあるシステムにテキストを入力していたところエラーが発生した。なかなか解決方法が見当たらず、専任担当者を探して待機しなければならないパターンである。希ではあるが、こういうことが起きると途方に暮れる。
待機時間にニュースを見ていると既報が目に入った。見えないUnicode文字を用いてフィッシングを行うというものだ。迷惑メールやフィッシングメールのフィルターによる防御を不可視文字の挿入でくぐり抜ける手法だが急増しているそうだ。
たしかにコードを扱うとUTF-8をデフォルトにすることが多いのでShift-JISのように?で化けることもなく、挿入されても気がつかないものだ。今後も増加することが予想される。何か手軽にチェックする方法はないだろうか。
不可視文字をクリップボードで捕獲する
以前、クリップボードからOCRでテキスト変換するコマンドを作成していた筆者は、クリップボードを使えば手軽にチェックできるのではないか?
Wikipediaの空白文字を対象にコピーしてクリップボードに空白文字がある状態でコマンドを実行するとアラートを出す仕組みを試してみた。Get-Clipboardも使えるが、クリップボード画像取得の際に用いた.NET Frameworkの[System.Windows.Forms.Clipboard]::GetImage()を::GetText()に変えて、正規表現で-matchで指定する。ハイフンを使えばu200B-のように後続のUnicodeも捕まえられる。
function fukashi
function fukashi {
Add-Type -AssemblyName System.Windows.Forms
$text = [Windows.Forms.Clipboard]::GetText()
if ($text -match '[\u200B-\u200D\u2060\uFEFF\u3164\uFFA0]') {
Write-Host "⚠クリップボードに不可視文字を検出" -ForegroundColor Red
}
}
これを関数コマンドfunction fukashiに設定(notepad $PROFILEで開いたプロファイルに記述、上書き保存。PowerShell上で.$PROFILEで即時反映)しておく。先のWikipediaの空白文字のページの表にあるzero width spaceのU+200B(u200B)を列横に選択してコピーする。
幅の部分に見えていないがu200Bが挿入されているので、実行すると
無事に赤文字でアラートする。
さらに不可視文字の範囲を広げてみる
Webサイトで調べてみると不可視文字は空白文字だけでは無く、タグ文字、双方向制御、Variation Selectorなど広範だ(invisible-characters.com、https://github.com/flopp/invisible-characters)。
クリップボードでアラートするだけの運用なのである程度見繕って広くとり、追加で、[\u200B-\u200F\u202A-\u202E\u2060-\u206F\uFE00-\uFE0F\uE0000-\uE007F\uE0100-\uE01EF\u3164\uFFA0]を加えてみる。
function fukashi
function fukashi {
Add-Type -AssemblyName System.Windows.Forms
$text = [Windows.Forms.Clipboard]::GetText()
if ($text -match '[\u200B-\u200F\u202A-\u202E\u2060-\u206F\uFE00-\uFE0F\uE0000-\uE007F\uE0100-\uE01EF\u3164\uFFA0]') {
Write-Host "⚠ クリップボードに不可視文字を検出" -ForegroundColor Red
}
}
先のサイトで正規表現で対応するU+2062 INVISIBLE TIMESをコピーして同様に実行すると
ちゃんと捕獲している。こうしておけば、まとまったテキスト全文をコピーしてペーストする前に、fukashiコマンドでチェックできる。どこまで網羅するかは、実務度合いで異なるだろうがアラートを出すだけで削除するわけではないので、正規表現ですべてを追加させてもいいのではないかと思った。
途方に暮れた件は、システム側のエラーであったのだが、意図せぬ不可視文字をクリップボードで把握しておくことは何かに付けて役立つだろう。



