PHPセキュリティ まとめ ver.01

気がついたら全く更新してませんね。

いえね、実は裏側ではだいぶいろいろ動いているのですが、チョコチョコしたことではなく結構でかめのことをやっているので、あまりこちらでちょくちょく公開できる感じでもないのですね。
まーそれはそれとして、気をとりなおしてブログ再開していきましょう。

脱引きこもりプロジェクトの第三弾か四弾として、PHPセキュリテイセミナーに参加してきました。

昨日全然寝てないもんだから、セミナー中に寝そうになってしまい「おぉ、これはウッカリ」と思って回りを見たらけっこうチラホラ寝てました。
まぁそれだけ基本的な内容だったとも云えるかもしれません。オライリーで勉強したことそのまんまという印象でした。

とはいえ、自作CMSをスパムにフルボッコにされた経験を持つ私としては、体系的におさらいが出来て有意義でした。
以前自分がまとめたものと合わせて、再度自分のためのおさらいとしてまとめようと思います。

<ul class="参考にした資料">
<li><!-- プログラミングPHP 第2版(オライリー) --></li>
<li><!-- 入門 PHPセキュリティ(オライリー) --></li>
<li><!-- PHP逆引きレシピ --></li>
<li>PHPセキュリティセミナー(セミナー)</li>
</ul>
※2010年07月01日現在。随時更新予定

【第1:基本的な考え方】

———————————————————————————————————————————————————————————————————————
●多重防御 ・・・複数のブロックをつける
●最小特権 ・・・ユーザーには必要最低限のパワーを与える
●シンプル ・・・ シンプルはセキュリティ。複雑なソースを作らない
●データの流出は最小限に ・・・機密データの不必要な流出は避ける
●データの追跡 ・・・どのデ-タがどこから来てどこへ行くのかを意識する

■変数は必ず初期化してから使う
■基本はPOST送信。GETはページidなどだけに使う。
■データベース(個人情報)、ログ、ライブラリはドキュメントルート配下に置かない(置くと誰でも見れてしまう)

【第2:安全なphp.iniの設定】

———————————————————————————————————————————————————————————————————————

●逆引きレシピのP589参照
●およびセミナーの内容を追記

【第3:入力のフィルタ】

———————————————————————————————————————————————————————————————————————

●1、入力を識別する ・・・どれが入力されたものかを識別する
(フォーム、URL、セッション、データベースから来たものは全て入力)

●2、入力をフィルタする
・内容および範囲のチェック
※フィルタはホワイトリスト形式で行う
※フォーム(チェックボックスなども)、URL、セッション、データベースからの全てが対象となる
※パスワード一致など、文字列の比較は必ず===で行う

●3、フィルタ前のデータとフィルタ後のデータを明確に区別
・$clean_xxxx変数を初期化
・$clean_xxxx変数にフィルタ後のデータを入れる

【第4:出力のエスケープ】

———————————————————————————————————————————————————————————————————————

●出力をする際は必ずエスケープする
・HTMLに出力(print)する直前にエスケープ → $clean_xxxx = htmlentities($xxxx,ENT_QUOTES,’UTF-8′)
(一部のHTMLタグを許可したい場合はHTML purifierライブラリを使用する)
・データベースに入れる直前にのエスケープ → mysql_real_escape_strings()など
‘※SQL文で使用する変数を’で囲まないと意味が無い

【第5:クロスサイトスクリプション、SQLインジェクション、NULLバイト攻撃】

———————————————————————————————————————————————————————————————————————

●クロスサイトスクリプション(XSS)
(ユーザーの入力したデータをそのままHTMLに出力することで発生する脆弱性)
・print出力前のエスケープで対応
$_SERVER[‘PHP_SELF’]の撲滅。代わりに$_SERVER[‘SCRIPT_NAME’]を使う

●SQLインジェクション(ユーザーが入力したデータをそのままSQL文として出力することで発生する脆弱性)
・SQL文出力前のエスケープで対応

●NULLバイト攻撃
(\0の文字で一部のバイナリセーフでない関数で発生する脆弱性)
・preg_matchでチェックする

if(preg_match(‘/\0/’),$sample){
die(“不正な入力です”);
}

【第6:セッションハイジャック対策、その他クッキー対策】

———————————————————————————————————————————————————————————————————————

●セッションハイジャック対策
(他のユーザーのセッションIDを乗っ取る攻撃)
・ログイン前後、権限レベル変更前後、DBの内容更新前後、SSLページへの偏移前後にsesson_regenerate_id(TRUE)でセッションを再生成する
・上記2のphp.iniの設定(セッション関係)を採用する

●セッションファイルの保存ディレクトリを他人がアクセスできない場所へ変更
(php.iniのsesson_save_pathで設定)

●setcookieの第7引数にtrueを入れて、JS経由のcookieへのアクセスをさせないようにする

【第7:CSRF対策】

———————————————————————————————————————————————————————————————————————

●CSRF対策
(サイトの権限を持ったユーザーに不正操作を実行させる攻撃)
・処理の前後でワンタイムチケット方式でのチェックをかます
(確認後、ワンタイムチケットに使用したセッションは初期化しないとあかんよ。)

【第8:ファイル関連】

———————————————————————————————————————————————————————————————————————

●ファイルが本当にアップロードされたものかどうかis_upload_file()でフィルタし、ファイルの移動も move_uploaded_file()を使う
●独自のファイル名に変更する
●もしも独自ファイル名に変更できず、ままのファイル名を採用しなくてはいけない場合は、basename()とrealpath()でチェックする(ディレクトリトラバーサル対策)
●ファイルのMAXサイズを決める

———————————————————————————————————————————————————————————————————————

7月1日時点では、セミナーで話してた内容だけをまとめているので、これから他の資料から学んだセキュリティのポイントも追加していって、結構まとまったものにしようと思います。

10日までには上に記載した書籍のセキュリティ関係の内容をすべて網羅した感じにします。

関連する記事


Fatal error: Call to undefined function similar_posts() in /home/sites/heteml/users/p/e/n/pencoro/web/picxpic.com/wp-content/themes/neutral/single.php on line 38