プログラミング言語によらずセキュリティ対策には3つの基本があると思います。
1.外部からの入力は信用せず、形式、範囲が想定内か確認する
2.外部システムへ出力を行う場合は適切なエスケープ処理を行う
3.セキュリティ上の問題が発生しても被害を最小限に留める措置を行う
1.の外部からの入力は信用しない、にはユーザからの入力だけでなく他のサブシステムの入力も信用してはならないです。例えばqmailのコマンド郡は同じ作者が作っているにも関わらずお互いに信用していません。
2.の適切にエスケープ処理を行う、はシステムに合った最適なエスケープ処理を行う事が必要です。例えば、システム上のコマンドを実行する場合やSQL文を実行する場合、適切なエスケープ処理は処理系によって異なる場合があります。
3.はfail safe機能は使えるものは使う、という事です。プログラミング上でのセキュリティ対策ではないですが適切な例を思いつかなかったのでGCCのstack protector機能を例に説明します。GCCにはstack protectorと言う機能を追加する事ができます。この機能を追加すれば仮に1.の「外部入力を信用しない」を守った「つもり」でプログラム作っていても、万が一スタックオーバーフローがあった場合でも任意コードを実行される危険性を大幅に低減することが可能になります。
どうしてわざわざこんな事を書くかというと、fail safeとして有用な機能やコードに対して「どうして有用なのか解らない」と思われてしまうケースがよくあるからです。Cプログラマでオーバーフローが発生したときにコード実行を防止してくれる機能がどうして有用なのか解らない、と考えられる方は少ないと思います。
# OSやGCCの基本機能として入れるか、入れないか、という部分では
# いろいろ議論の余地はあるとは思いますが…
使用する言語を問わず致命的な問題にならないよう対策が取れる場合は有用に活用するべき、と私は考えています。fail safeな機能や仕組みは軽視されがちですが、私は非常に重要だと考えています。普通はだれでも間違えたくて(バグを作りたくて、セキュリティホールを作りたくて、など適当に読み替えてください)間違える訳ではありません。それでも間違いは起きる物です。間違いは起きるのは当たり前、を前提とするとfail safe機能の重要性は理解してもらえるのはないか、と考えています。
このブログでセキュリティ上の対策などを断片的に書く事がありますが、これらの基本は踏まえた上での対策として書いています。
ところで、PHPの場合、fail safe機能として利用できる機能には
– open_basedir設定
– allow_url_fopen設定
– カスタムエラーハンドラ登録
があります。safe_modeもありますがPHP6では削除候補なので入れていません。
# あまりよく考えていないので他にもあるかも。コメント歓迎します。
追記:
fail safe的な機能として利用できる機能:
-disable_function設定
-disable_classes設定
-max_execution_time設定
-max_input_time設定
-post_max_size設定
-memory_limit設定
-log_errors設定
-auto_prepent/append設定
-シャットダウン関数登録
-file_upload設定
-upload_max_filesize設定
-default_socket_timeout設定
-DB接続の永続的接続無効化