【この記事の所要時間 : 約 5 分】
アプリケーションを作る上で、必要最低限のセキュリティってあると思う。
プログラムだけできる人がアプリケーションを作っても、システムとして動くけれども、セキュリティ的に甘いシステムができあがる可能性が高い。
そういうのはクライアントに納品するのもアウトだし、自分で使うのもアウトだと思う。
(踏み台に使われる可能性があるから)
そういう意味でノウハウとしてセキュアプログラミングを知っておくのは最低限必要だと最近とくに思う。
PHPで最低限必要なセキュアプログラミングは7つくらいだと思う。
詳しい人からは甘いといわれるのは覚悟の上ですが。
まーほんとに最低限として。
1.クロスサイトスクリプティング対策
2.Formの入力チェック
3.SQLインジェクション対策
4.ディレクトリトラバーサル(パストラバーサル)対策
5.けっこう漏れる入力チェック漏れ対策
6.Cookie利用
7.セッションハイジャック対策
1.クロスサイトスクリプティング対策
クロスサイトスクリプティング対策としては、「サニタイジング」ですね。
専用関数specialcharsを利用するのもいいが、サニタイジングする箇所が増えると記述漏れという心配も出てくるので、smartyを使って($o_smarty->default_modifiers=array(‘escape:”html”‘))とすれば、テンプレート内で出力されるすべての変数に対して無条件にサニタイジングできる。
2.Formの入力チェック
Formの入力チェックは基本ですが、必須ですね。
そして、Javascriptを使ってクライアントサイドをする入力チェックは補助的に使ってメインに使うのは、PHPを使ってサーバサイドでする入力チェックですね。
(Javascriptはユーザーが無効にできるから)
PHPの標準ライブラリPEARのPEAR::HTML_QuickFormを使えば、簡単に入力チェックができるのでオススメですね。
3.SQLインジェクション対策
SQLインジェクション対策はSQLの予約文字のエスケープ処理ですね。
これは、mysqlを使っているならmysql_escape_string関数が利用できるが、変数1つ1つエスケープしなくてはいけない。正直めんどくさいし、エスケープする箇所が増えると記述漏れという心配も出てくるので、PEAR::DBをプレイスホルダを使うのがいい。
queryメソッドはパラメータをプレイスホルダに引き渡すときに自動的にエスケープしてくれるので、これを利用すれば、漏れなくエスケープできるのでオススメ。
4.ディレクトリトラバーサル(パストラバーサル)対策
ディレクトリトラバーサル(パストラバーサル)対策は、php.iniの設定で、allow_url_fopenをOffにすることで予期しない外部スクリプトを実行できないようにできる。ただし、このような制限をかけるとアプリケーションの作り上、設計などに制限がでてくるので、若干制限は弱くなるが、セキュリティと設計のバランスを見て、正規表現を使うことで対応するのがいいと思う。
やり方としては、
if(preg_match(‘/^[0-9a-zA-Z]+$/’,$_GET[‘url’])){
require_once($_GET[‘url’]);
}
とすれば、まーOKだと思う。
5.けっこう漏れる入力チェック漏れ対策
けっこう漏れる入力チェック漏れ対策とは、Formの入力チェックでよく漏れる項目を漏れていないかチェックしましょうということです。
どのようなものがよくチェック漏れをするのか?ですが、
あらかじめ固定値や選択オプションが決まっているのでそれ以外の値が入力されることはないと勘違いしやすい項目ですね。
つまり、プルダウンメニューやラジオボタン、チェックボックスやhiddenなどですね。
こういうのは、クライアント側で簡単に改ざんできるので、忘れがちですが、きっちり入力チェックしましょう!ということです。
6.Cookie利用
Cookie利用ですが、Cookieを使う場合は、データ本体をクライアントで保持するという仕組みはなしで、Cookieを使うならCookieにはセッションIDだけ保持させて、サーバ側でセッションIDをキーにそれにひもづくデータ本体を取得する仕組みにしましょうということです。
(データ本体をクライアント側に渡してしまうと、改ざんも盗聴もできるためやめましょうということ。セッションIDが改ざんや盗聴されてしまう危険はありますが、セッションIDを改ざんや盗聴されてもセッションハイジャック対策ができていれば、データ本体が盗聴される危険はないため、そっちの仕組みにしましょうということ)
7.セッションハイジャック対策
セッションハイジャック対策とは、6のCookie利用で出ていた、セッションIDを盗聴された場合の対策ですね。これはセッションの有効期限を適切に設定することが対策になりますね。
セッションIDの盗聴は防げなくても、セッションIDが短時間で無効になればデータ本体を盗聴される危険性は少なくできる。(ただしゼロではありませんが。)
セッションの有効期限の設定はphp.iniのsession.gc_maxlifetimeですね。
アプリの仕様とセキュリティのバランスを見て値を決めればいいと思います。
以下、参考までに。
セッションハイジャック と session_regenerate_id( )関数
リックテレコム
売り上げランキング: 6,047