永きに渡るバリデーション論争に終止符を打つために

記録よると最初のバリデーション論争が起こったのは2008年だそうです。

その後、たびたび論争が起き現在に至ると言うのが人類の歴史です。

この論争はいろいろなトピックを含む興味深いもの(とどうでもよいものの集合)ですが、一言で表すとすると、以下の問いに集約できるのではないかと思います。

入力バリデーションはセキュリティ対策かどうか?

そして、そろそろこの論争にも終止符を打てないかと思います。なんとなく疲れてきている人が多そうなためです(w

そのために何が一番必要かと考えると、言葉や概念の整理、定義がやっぱり必要なのではないかと思いました。

概念の整理

アプリケーション仕様とセキュリティ仕様

私の理解では、「アプリケーション仕様」の中に「セキュリティ仕様」があります。アプリケーション仕様の方が広い概念であり、セキュリティ仕様はその一部になります。

アプリケーション仕様⊃セキュリティ仕様

そして、セキュリティ仕様を実装したものが「セキュリティ対策」です。

ただし、これだけでは、セキュリティ対策が何なのかはわかりません。

セキュリティ対策とは何か?

日本語として普通に考えると、セキュリティ対策は「セキュリティのための対策」なのかなと思います。でも、まだ漠然としています。

また、主な議論の対象であるWebアプリケーションセキュリティやインターネットセキュリティという分野において、「セキュリティ対策」の公式な定義はないようです。

ということで、漠然とした概念が議論をややこしくしているようです。

twitter上での私の情報収集によれば、この議論でのセキュリティ対策の定義には大きくわけて以下の2つがあるようです。

  1. 結果としてリスクを緩和するすべての対策
  2. リスク緩和を主目的として実施する対策

ここでは、1.を「広義のセキュリティ対策」、2.を「狭義のセキュリティ対策」と呼ぶことにします。

入力バリデーションはセキュリティ対策なのか?

「広義のセキュリティ対策」を採用すれば、入力バリデーションはリスクを緩和することも多々あるので「入力バリデーションはセキュリティ対策である」となるでしょう。

「狭義のセキュリティ対策」を採用すれば、入力バリデーションはリスク緩和を主目的とはしていないでしょうから「入力バリデーションはセキュリティ対策ではない」となるでしょう。

つまり、入力バリデーションはセキュリティ対策なのか?という問いの答えは「はい」でも「いいえ」でもどちらも正しいと言えます。

あるいは、言い換えれば、「入力バリデーションはセキュリティ対策なのか?」は「セキュリティ対策が何なのか」という前提条件により結果は変わります。

われわれは何を議論しているのか?

入力バリデーションはセキュリティ対策なのか?についてはどちらもと言える、という結論に至りました。

そして新たな問い、あるいは真の問いが生じます。

入力バリデーションがセキュリティ対策か否かを区別する必要性は何か?

あるいは、

入力バリデーションはセキュリティ対策であるべきか?

念のため記載しておきますが、残念ながら入力バリデーションをしなくてもいいという意見の方はいないようです。入力バリデーションがセキュリティ対策か否かにかかわらず、入力バリデーションは実施すべきとされています。


以下は徳丸さんの日記より引用 http://blog.tokumaru.org/2015/02/eximghost.html

では、バリデーションはどのように考えればよいでしょうか。従来から言っていることですが以下を推奨します。

  • バリデーションの基準はアプリケーションの仕様である
  • 仕様を満たさない入力値は再入力を促すナビゲーションを行う
  • アプリケーション仕様として、すべての入力パラメータの以下項目を定義しておく
    • 文字種
    • 文字列長の最小・最大値
    • 数値の場合は最小値・最大値
    • メールアドレス等は書式

文字列長に関しては、制限をとくに設けていないアプリケーションも多いと思いますが、実用性を損なわない範囲で上限値を定めて、その上限まで正常に動作することと、上限値を超えた場合にエラーになることをテスト項目に加えるとよいでしょう。

(引用ここまで)


もし、入力バリデーションを省略してもいいという意見の方がいればお教えください。

関連

Date: 2015/02/05

Tags: security, validation