ガードを強固にする

システムやデザインに限らず理想を追求するには時間がかかりますよね。

特にシステムを組む場合はセキュリティを固めておかないとユーザー側が行った操作で予期せぬ現象が発生することもあります。予算面や時間がない厳しめの案件だと企画や設計も含めて作り込みが甘くなりがちなので注意しておかなければなりません。

重要な点を3つ挙げるとしたら下記です。

・入力点の極小化
・境界ごとに多層防御
・想定外は即エラー

攻撃の9割は「入力」から始まります。逆に言えば攻撃者が触れられないシステムは破られません。つまり、入力に自由度があるほど危険度も変わるわけですね。

当然、100%突破不可能なシステムは存在しません。

1. 入力点(ユーザー側が触れる部分)を極限まで制限
2. データの流れをブロック単位で「境界防御」する
3. 予期しない動作をすべて例外処理として潰せる設計

上記3つを時間が許す限り作り込んで突破されにくい仕組みにするということです。

ちなみに「1」は文字列のサニタイズやデータベース処理時のプリペアドステートメント等の対策。そして「2」はhtml出力生成時のエスケープ等々。あと「3」も意外と重要で想定外の値が入ってきた場合に処理を即中断させる条件分岐といった内容。

まだまだ対策方法はありますが結局は予算次第です。

とはいえ基本的なセキュリティ対策のみで細かい対策は甘めで作らざるを得ない状況もよくあります。細部の処理まで作り込むと言ってもケースバイケースで限界があるため現実的には【可能な範囲で実装する】といった時間との勝負になるかとは存じます。

迷った時は基本に戻る

どんなシステムも「入力と出力」しかありません。

入力(Store / Ingest)

外部から入ってくるすべて = データの「取り込み」。

・フォーム入力
・APIリクエスト
・ファイルアップロード
・クッキー / セッション
・DB書き込み
・ログ保存
・設定変更

上記は全部入力(システムに取り込む行為)です。

出力(Serve / Provide)

システムが内部から返すもの = データの「出力」。

・HTML表示
・JSONレスポンス
・API応答
・ファイル配布
・画像提供
・メール送信
・DB読み出し結果を表示

出力はシステムから外部へ返す行為そのもの。

すべての処理を1つずつ小分けにすると意外とシンプルな構造ですよね。丁寧に安全なロジックで書くことは必須。実装時間はイコールで成果物のクオリティにそのまま直結するという点を忘れてはなりません。なるべく時間をかけて作り込んでいきましょう。

記事にコメントを残す