危険な「〇」文字

上記2件の実行結果です。

Compareでは、CompareOrdinalはマッチせず、CompareのInvariantCultureではマッチします。Ordinal以外では「〇」文字は無視されます。

IndexOfで「〇」文字はすべての文字にヒットします。「あいうえお」くらいしか試してませんが、もしかしたらCharのすべての値にヒットするかもしれません。Ordinal以外のIndexOfではすべてこの問題が起きます。string.IndexOfも同様なので、ASP.NETなどで使う場合は注意が必要です。
さらに、同様の特徴を持った不思議な文字が多数あります。「\u01f6」〜あたりがヒットしまくる文字です。あんまり多いので調べるのやめました。

この2件をMSのセキュリティ問題窓口に報告したけど、セキュリティ上の脆弱性ではない、また各アプリケーションの実装に依存する事象だと返事が来てしまいました。まぁ、大きな問題ではないと思ってたので、それでいいことにしておきます。想像力が欠如した思考停止状態かもしれないので、いやこれは大きい問題になると思った方は注意してくださいね。
それから、自分のシステムに「〇」文字を入れてどうなるか試してみてください。検索で全部ひっかかる裏技としても使えます。自分のアプリではそうでしたw

(id:atsushienoさん、トラバさせていただきま〜す)

(追記)
IndexOfで「〇」だけで検索するとあらゆるものにヒットするのって、ゼロ文字が無視されてIndexOf( str, "" )が実行されるのと同じだからなんですね。今頃気付きました。

Compareの危険性

MSDNライブラリの「カルチャを認識しない文字列比較の実行」によると、「セキュリティ上の決定が文字列比較の結果に基づいて行われる場合は、カルチャを認識しない操作を実行して、結果が CultureInfo.CurrentCulture の値の影響を受けないようにします。」とあります。
本当にそれだけでいいんでしょうか?

using System;
using System.Globalization;

namespace Siokoshou
{
  public class Test
  {
    static void Main()
    {
      if ( 0 == String.CompareOrdinal( "〇あ", "あ〇" ) )
        Console.WriteLine( "Much! (CompareOrdinal)" );

      if ( 0 == String.Compare( "〇あ", "あ〇", false, CultureInfo.InvariantCulture ) )
        Console.WriteLine( "Much! (InvariantCulture)" );

      Console.ReadLine();
    }
  }
}

あなたの望む動作はどちら?