チェ・ゲバムラの日記

脱犬の道を目指す男のブログ

PHPに関するセキュリティのまとめ その2

自分が本を読んで学んだことをまとめた②


「セキュリティ、攻撃方法とその対策について②」

SQLインジェクション
データベース操作のクエリを改ざんし、データを不正に取得したり改ざんする攻撃。
【対策】:プリペアドステートメントを利用
→事前にSQL文の雛型を設定し、その中に変数となる部分を指定しておく。
変数となる部分に値を代入することで、SQL文の構造自体は改ざんされることなく実行することができる。

(例)update文
$sql = 'update テーブル名 set name =:name where id = :value';
:name、:valueに値を指定する


②セッションIDの固定攻撃
正常サイトから悪意を持ったユーザが正規のセッションIDを取得し、そのセッションIDを他のユーザに強制する攻撃。
強制されたセッションIDでユーザがログインした場合、そのセッションIDを元々知っている悪意を持ったユーザは、ログインしたユーザに代わって操作を行うことができる。
【対策】
→ログイン後にセッションを新規に作る(セッションIDの再発行)。
→ログイン後にセッションIDとは別に認可されたことを証明する情報を付加する。


セッションハイジャック
他人のセッションIDを盗み、そのセッションIDを使ってなりすます攻撃。
【対策】
→セッションIDを乱数・アクセス日時・IPアドレス等を使ってハッシュ化し簡単に予測出来ないものにする。
php.iniの設定を確認する。
・URLにセッションIDを付加しない(デフォルト:0)。
session.use_trans_sid = 0

・セッションIDの保存にcookieを使用する(デフォルト:1)。
session.use_cookies = 1

・セッションIDの保存にcookieのみを使用することを指定(デフォルト:1)。
session.use_only_cookies = 1
 
・session.nameの値をデフォルトの「PHPSESSID」から変更する
session.name = abcdefgh

PHPが発行したセッションID以外は無効にする
session.use_strict_mode = 1


④HTTPヘッダインジェクション
HTTPヘッダとして出力されるパラメータに改行を含めることで、意図しないレスポンスヘッダを出力させる攻撃。
【対策】
→PHP5.4以上のバージョンを使用する
PHPのHTTPヘッダーを送信するheader関数は文字列中に改行文字を許可していません。
(→リクエストボディに設定された文字列のバリデーション)