セキュアコーディングの基本概念は、言語のタイプを問わず、全てのプログラミング言語と互換性があります。
プログラムの基本構造とせキュコーディング
セキュアコーディングはプログラムの基本構造にあったセキュリティ対策を行うよう考えられています。全てのプログラムは基本構造として
- 入力 → 処理 → 出力
の構造を持っています。この基本構造はコンピュータープログラムが考案されてから変わらない基本構造です。プログラムロジック(処理)が正しく動作する為には妥当なデータが原理的に必要です。プログラムロジックで処理済みのデータが出力先で誤作動を起こさないように無害化したデータが必要です。
入力 / 処理 / 出力はそれぞれ役割(責任)を持っています。
- 入力: 入力データの形式的な妥当性確認
- 処理: 入力データの論理的な妥当性確認およびデータ処理
- 出力: 出力データの安全性保証(無害化保証)
CERTのセキュアコーディングでは以下のように定義しています。
- 入力: セキュアコーディング原則1(入力バリデーション)
- 処理: 正しい(=セキュア)なコード記述(セキュアコーディング原則+セキュアコーディング標準)
- 出力: セキュアコーディング原則7(出力無害化)
プログラムの基本構造はプログラミング言語のタイプに関わらず不変です。この為、セキュアコーディングの基本概念はプログラミング言語のタイプに関わらず適用できます。
プログラミング言語のタイプ
プログラミング言語は、大きく分けて、手続き型、関数型、オブジェクト指向型、宣言型に分類できます。どのタイプの言語でも”プログラムの構造化”が目的です。構造化の方法が異なるだけです。
- 手続き型: データ処理を順番に処理を記述、”手続き”として構造化
- 関数型: データ処理を数学的な”関数”として構造化
- オブジェクト指向型: データ処理とデータを抽象化した”オブジェクト”ととして構造化
- 宣言型: データ処理を”宣言”として構造化。宣言型の言語は4GL(第四世代言語)とも呼ばれる。SQLなどが4GL。
どのタイプのプログラミング言語でも
- 入力 → 処理 → 出力
の基本構造は同じです。以下のようになっている(構造化)されているだけです。
- 手続き型: 入力 → 手続き定義 → 出力
- 関数型: 入力 → 関数定義 → 出力
- オブジェクト指向型: 入力 → オブジェクト定義 → 出力
- 宣言型: 入力 → 宣言定義 → 出力
多くの言語が純粋な◯◯型のプログラミング言語として設計されているのではなく、マルチパラダイム言語(複数の◯◯型のプログラミング言語)として設計されています。
例えば、宣言型のSQL言語もSQLだけではなく手続き型のストアドプロシージャーと一緒に使えるデータベースが多いです。オブジェクト指向型の言語でも手続き型のコード記述もサポートしている言語、C++/C#/Javaなど、が多いです。最近ではオブジェクト指向型の言語でも関数型のコード記述が可能となっているのが一般的になってきています。
まとめ
セキュアコーディングの基本概念は言語やプログラム設計に関わらず、適用できる汎用性が高い概念です。ISO 27000などのセキュリティ標準で求められているから、といった消極的な理由ではなく、プログラミングの基礎/基本として身に付けておくべき基礎知識です。。
ただ、セキュアコーディング/セキュアプログラミングというと普通はCERTのセキュアコーディングの概念を指します。少なからず(?)、基本概念がまったく異なるモノをセキュアコーディング / セキュアプログラミングとしている例もあるので注意が必要です。