カテゴリー/アーカイブスへ移動

記事見出し索引

セキュリティ : PHP

PHPのセキュリティに関する覚書。

PHPセキュリティは設定とコードの2通りある。

設定におけるセキュリティ

設定はphp.iniまたはhtaccessで行なう。PHPの設定はphpinfo関数で設定を確認できる。

php.ini,htaccessの主なセキュリティ関連項目

コードにおけるセキュリティ

Webプログラミングのセキュリティーの問題の多くは、外部からのリクエスト(GETやPOST)を、プログラム内部で処理する際、プログラム作成者が意図していない、悪意のあるリクエストを送信されることより発生。

プログラム作成者は、$value = $_GET[’key’]や$value=$_POST[’key’]によって取得する外部リクエストの値($value)に、悪意のあるデータが含まれる可能性を考える。

取得した外部リクエストが、有害なデータが含む可能性を考え、有害なデータをエスケープしたり、HTML実体参照に変更するなどの対策(無害化:サニタイズ)が、Webプログラミングでのセキュリティーの中心。

簡単な例

----- HTML -----
<textarea name="msg"></textarea>

----- PHP -----
$msg = $_POST['msg'];
print($msg);

----- テキストエリア ---
<script type="text/javascript">alert("Hello World");</script>

テキストエリアは、Javascriptを記述して送信できる。PHPは、送信された外部リクエストをそのまま出力しているため、出力ページにアクセスした人に対してJavascriptが実行される。

前提知識

Webプログラミングのセキュリティーを考える上で必要になる知識についての簡単なまとめ

リクエスト変数

外部リクエスト変数(GET,POST,COOKIE)にはクライアント・サイド・スクリプトを埋めこむことができる。同様に$_SERVER[’PHP_SELF’]等の一部のSERVER変数にもクライアント・サイド・スクリプトを埋めこめる。よって外部リクエストをセキュリティー対策をせずにそのまま出力(表示)することは、クライアント・サイド・スクリプトを実行される危険性につながる。

クライアント・サイド・スクリプト

クライアント・サイド・スクリプトは、通常Javascript。対策としてもJavascriptを念頭におく。JavascriptではURL転送やクッキーの送信などが可能であり、クライアントの情報を不正に外部へ送信する等の危険につながる。

サニタイズ

サニタイズとは無効化・無害化という意味であり代表的なサニタイズとしてHTMLサニタイズとSQLサニタイズがある。

HTMLサニタイズ

HTMLサニタイズとはHTMLで特別な意味をもつ<や>を通常の文字として扱われるHTML実体参照>や<に変換することである。外部リクエストをスクリプトから表示する際に行われる。

SQLサニタイズ

SQLサニタイズはSQL文で文字列の区切り文字として使われる’(シングルクウォート)や”(ダブルクウォート)を\でエスケープすることである。外部リクエストをSQL文として利用するときに行われる。

Javascriptの記述位置

HTMLファイルにJavascriptを記述する方法は大きく2種類ある。

悪意のあるJavascriptへの基本的的な対策は出力の際に下記の対策を行う。
(1)にはhtmlspecialchars関数を使ってHTMLサニタイズを行う。
(2)にはpreg_replace関数を使ってHTMLサニタイズを行う。

preg_replace('/javascript/i','',preg_replace('/[x00-x20x22x27]/','',$url));

※preg_replaceはPerl互換の正規表現置換関数であり、正規表現の16進数表記は\xで始まる。
※\x00~\x20は正規表現の16進数表記で制御コード(\x00はヌルバイト)を表す。
※\x22は”(ダブルクウォート),\x27は’(シングルクウォート) を表す。

ヌルバイト

\x00や\0をヌルバイトと呼ぶ。PHPはヌルバイトを文字列の終端とみなさないバイナリセーフな関数と、文字列の終端とみなすバイナリセーフでない関数が存在する。
ヌルバイト攻撃とはバイナリセーフな関数とバイナリーセーフでない関数がPHPで混在して存在することより発生する。
※PHPのダブルクウォート文字列での16進数表記は\xではじまる。
※ヌルバイト\x00や\0をURLエンコーディングすると%00になる。

ホワイトリスト法

ホワイトリスト法とは外部リクエスト変数チェックで、指定した値のみを許可する方法。ブラックリスト法よりも厳しいチェックになる。

$list = array("a","A");
$v = $_GET['alphabet'];
if(!in_array($v,$list)) {
	exit;
}

※a,Aのみ許可する。

ブラックリスト法

ブラックリスト法とは外部リクエスト変数チェックで、指定した値のみ禁止する方法。ホワイトリストよりも緩やかなチェックになる。


$list = array("a","A");
$v = $_GET['alphabet'];
if(in_array($v,$list)) {
	exit;
}
※a,Aのみ禁止する。

公開ディレクトリと非公開ディレクトリ

公開ディレクトリと非公開ディレクトリを明確に分ける必要がある。インターネットに直接公開する必要のないファイルは非公開ディレクトリへ配置する。詳しくはURL(Uniform Resource Locator) : HTTPを参照。

HTTPリクエスト,HTTPレスポンス

WebプログラミングではHTTPを理解しておくと良い。HTTPについての詳細はHTTPの基礎事項を参照。

  このページの上へ

スポンサード リンク

  Yahoo!ブックマークに登録    Google  この記事をクリップ!  BuzzurlにブックマークBuzzurlにブックマーク

2008/9/2 火 | security, PHP | 固定リンク |

この記事にはまだコメントがついていません。

コメントの投稿

段落や改行は自動挿入です。メールアドレスはサイト上では非表示です。
使用できる HTML タグ: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

(必須)

(必須)


トラックバックURL