思考停止のコピペで脆弱性を放置するな
- 画面で見えない文字はAIの入力値を改ざんする
- stripや正規表現のコピペでは41個取りこぼす
- Python標準のカテゴリ判定が最強のフィルタ
現場で起きている「見えない改ざん」の地獄
多くのAIエンジニアは、外部テキストを読み込ませる際、画面上の見た目だけを信じて処理を投げている。だが、現実は甘くない。Unicodeには、人間には認識できず、モデルには確実に「文字列」として届く「見えない文字」が大量に存在する。
よくあるコピペ正規表現を盲信して「これで安全」と悦に入っている間に、悪意ある命令がゼロ幅スペースやタグ文字に隠れてエージェントに注入されている。ここを見誤ると一生養分のままだ。手動のレビューで防げる範囲を超えた構造的な欠陥を、標準ライブラリのロジックで強制的に排除する。
40行で実装する「見えない文字」一掃フィルタ
コピペ正規表現がゴミである理由
ネット上のスニペットは、過去の攻撃パターンを並べただけの「ブラックリスト方式」だ。Unicodeの版が上がるたびに新しい制御文字が追加されるため、列挙型は必ず陳腐化する。170個あるCfカテゴリのうち、41個を取りこぼすようなザルを通すのは、もはや自殺行為と変わらない。
カテゴリ判定で生存圏を確保する
`unicodedata.category()` を使え。コードポイントの範囲指定ではなく、文字の「属性」で弾くのが唯一の解だ。Cf(書式)、Cc(制御)、Co(私用領域)を監視し、改行や絵文字合成に必要な例外だけを残す。これで未知のUnicode文字も漏れなく処理できる。
最小労力で勝つためのコアロジック
処理速度は84万文字で195ms。パイプラインの入り口に置いてもボトルネックにはならない。除去した文字数をログに出すだけで、外部入力の毒性が可視化される。
正直な懸念と向き合う
自動化のメリット
- 未知のUnicode攻撃を無効化
- ログで異常入力が即時判明
- 標準ライブラリのみで完結
注意すべきリスク
- 日本語以外の多言語で誤判定の可能性
- 同形異字攻撃は防げない
このフィルタは「見えない文字」を落とすことには特化しているが、言語的な意味を偽装する攻撃には無力だ。また、ユーザーが入力した多言語テキストに適用すると、正当な結合文字まで壊して表示崩れを起こす可能性がある。外部からのデータか、ユーザー入力か。この線引きをコードで分けるのが、プロとしての最低限の設計だ。
こんな人におすすめ
- GitHubのREADMEをAIに食わせている人
- 自動ブログ運営でWebスクレイピングを多用する人
- 正規表現のコピペに違和感を抱いている人
- AIエージェントのセキュリティ強度を上げたい人







