文字列とセキュリティ

文字列を入力に受け付けるっていうのは、間口の広い入り口を設けることになる。
間口の広いとはどういうことかというと、反対の狭い例を考えて見るとよくわかる。例えば、提示したいくつかの選択肢から選ばせる場合や、数字のみ入力に受け付ける場合なんてのが挙げられる。
間口が狭い場合は、チェックが容易だ。選択肢にないものをはじく、数字ではないものをはじく、数字の許容範囲を超えているものをはじくのは比較的容易だ。
文字列を受け付ける場合はどんなときがあるだろう?検索窓からの入力、アカウントの入力、パスワードの入力、記事を投稿する際の入力…。いくらでもありそう。数字を受け付ける場合も、バックエンドに渡るころには数字として扱っていても、初めは文字列として入力される。
入力された文字列の厳重なチェックはかかせない。当然サニタイジングしたり、SQLインジェクション対策のために文字列を厳重にチェックしているよね?
ASP.NETに限らず、セキュリティについて常に考えていますか?

IPA セキュア・プログラミング講座:IPA 独立行政法人 情報処理推進機構
IBM Developer 日本語版 : 大変申し訳ありません。このページは無効です。
IBM Developer 日本語版 : 大変申し訳ありません。このページは無効です。

ところで、そのチェックは完全ですか?ザルだったりしませんか?
文字列の比較って、どういう処理をしているのか知っていますか?

IndexOfのCompareOptionsの詳しい解説

IndexOfでのCompareOptionsについてid:siokoshou:20050411のプログラムでいろいろ調べてみました。
Compareはまた別かもしれないので注意!


Ordinalは各文字のUnicode値を単純に比較する。もっとも単純な比較処理。デフォルトがこれだと思っていたら痛い目に会うので注意!


IgnoreCaseは大文字と小文字の区別をしない比較。「cool」と「Cool」、「COOL」、「cOOl」、「cool」が一致する。


IgnoreWidthは半角全角の区別をしない比較。カタカナのほかに「ABC」と「ABC」も一致する。
全角半角記述の論争も.NETが解決してくれる、人に優しいオプションw


IgnoreKanaTypeはひらがなとカタカナの区別をしない比較。「ドラえもん」と「ドラエモン」や「どらえもん」が一致する。「スネ夫」と「スネオ」は一致しない。


IgnoreSymbolsは空白文字、句読点、通貨記号などなどを無視する比較。かなり複雑な比較。ここまでくると、何が何やら分からない。MSDNライブラリの説明にも「〜などの記号を無視する」と記述されている。「など」って言われても…。その「など」を知らないと怖くて使えない…。
「cool」と「 c o o l 」や「c o o l」(先頭の空白に注意)が一致する。「cool」と「co%&$#ol」が一致する。


IgnoreNonSpaceの説明はMSDNライブラリより引用。
「文字列比較で、発音区別符など、非スペーシング組み合わせ文字を無視するように指定します。Unicode 標準は、基本文字を組み合わせて生成される新しい文字を組み合わせ文字として定義しています。非スペーシング組み合わせ文字は、表示されるときに文字間隔用の領域は確保しません。非スペーシング組み合わせ文字の詳細については、http://www.unicode.org の「The Unicode Standard」を参照してください。」
Unicodeの知識がないので、私には分かりません、これ。かなり高度な比較です。

「キー」と「キィ」が一致します!
ドイツ語の例(4/11のソースの例)なら「ss」と「\u00df」(エスツェット)が一致します。というのは実はひっかけの誘導で、「ss」と「エスツェット」が一致しないのは CompareOptions.Ordinal 指定のときだけです!「キー」と「キィ」の例は IgnoreNonSpace 指定時のみ一致です。


最後に残ったNone。StringSortはIndexOfでは使えま...あれ、使える例を発見…。おいおいおいおい。

続く