ウェピックスではウェブ界の情報をピックアップします!
menu
ホーム > PHPセキュリティー > 11 共有サーバーの留意点 > 11-1 共有サーバーの留意点

11-1 共有サーバーの留意点

Pocket

説明

共有サーバー
POINT

  • 共有サーバーに設置したファイルはすべて流出の危険がある
  • 顧客情報など機密性の高い情報を扱う場合は共有サーバーは避ける

共有サーバーは複数のユーザーで一つのサーバーを使用しる共有型ホストです。共有サーバーは専用サーバーのように物理的に隔離されていないので、顧客情報や機密性の高い情報を扱う場合は避けるべきでしょう。共有サーバーに設置したファイルのソースコードは、すべて流出する可能性があると考えた方がよいでしょう。ドキュメントルートの外側に格納したファイルでも流出の可能性はあります。

データベースの利用
POINT

  • 機密性の高い情報は全てデータベースに格納
  • データベースへのアクセス認証ファイルの機密性が重要
  • データベースへのアクセス認証ファイルのフォルダ名はmd5
  • データベースへのアクセス認証ファイルへは root か 自分 のみに読み出し制限

共有サーバーの場合、機密性の高い情報は全てデータベースに格納する必要があります。その場合、データベースへのアクセス認証ファイルの機密性が重要になります。認証ファイルはドキュメントルート以外に設置し、格納するフォルダ名も md5 なので作成した見分けにくいフォルダ名にしましょう。また、認証ファイルは root自分 だけが読み出だせる設定にしましょう。

データベースアクセス証明書を次のフォーマットで設置する。

rootユーザーに制限

SetEnv DB_USER "myuser"
SetEnv DB_USER "mypass"

自分だけに制限

$ chmod 600 database.conf
$ ls database.conf
-rw------ 1tryphp tryphp 48 May 20 10:00 database.conf

セッションデータの漏洩
POINT

  • セッションデータをデータベースに格納する

PHPのセッションデータが格納されるセッションデータコンテナは、通常 /temp の中に格納されます。この /temp はすべてのユーザから書き込みが出来ます。共有サーバーの場合は、 /temp フォルダを複数のユーザーがセッションデータを書き込んでいる場合もあります。セッション変数で機密情報を扱っている場合は非常に危険です。実際、共有サーバーで他のユーザーのセッション変数の内容を盗み見るスクリプトなど直ぐに書けるでしょう。

セッションデータをデータベースに格納することでセッションデータの漏洩を回避できます。また、データベースに格納することでセッションインジェクションのような危険な攻撃への防護策にもなります。

テーブルの作成

//テーブルの作成
create table sessions(
	id varchar(32) NOT NULL,
	access int(10) unsigned,
	data text,
	PRIMARY KEY (id)
);

セッションデータをデータベースに格納する関数

//1 open
function _open(){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);

	if($dbConnect){
		return mysql_select_db($dbName,$dbConnect);
	}
	else{
		return false;
	}
}

//2 close
function _close(){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);

	return mysql_close($dbConnect);
}

//3 read
function _read($id){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);
	mysql_select_db($dbName,$dbConnect);

	$id = mysql_real_escape_string($id);
	$sql = "select data from sessions where id = '$id'";

	if($result = mysql_query($sql, $dbConnect)){
		if(mysql_num_rows($result)){
			$rows = mysql_fetch_array($result);
			return $rows['data'];
		}
	}
	return '';
}

//4 write
function _write($id, $data){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);
	mysql_select_db($dbName,$dbConnect);

	$access = time();

	$id = mysql_real_escape_string($id);
	$access = mysql_real_escape_string($access);
	$data = mysql_real_escape_string($data);

	$sql = "replace into sessions values ('$id', '$access', '$data')";

	return mysql_query($sql, $dbConnect);
}

//5 destroy
function _destroy($id){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);
	mysql_select_db($dbName,$dbConnect);

	$id = mysql_real_escape_string($id);

	$sql = ""delete from sessions where id = '$id'"";

	return mysql_query($sql, $dbConnect);
}

//6 clean
function _clean($max){
	//変数取り込み
	global $sqlServer;
	global $dbName;
	global $dbUser;
	global $dbPass;

	$dbConnect = mysql_connect($sqlServer,$dbUser,$dbPass);
	mysql_select_db($dbName,$dbConnect);

	$old = time() - $max;
	$old = mysql_real_escape_string($old);

	$sql = "delete from sessions where access < '$old'";

	return mysql_query($sql, $dbConnect);
}
&#91;/PHP&#93;


<strong>SESSIONの呼び出し</strong>
[PHP ruler="true" toolbar="true"]
session_set_save_handler(
   '_open',
   '_close',
   '_read',
   '_write',
   '_destroy',
   '_clean'
   );
session_start();

タグ(=記事関連ワード)

日付

投稿日:2012年7月22日
最終更新日:2012年08月29日

関連記事

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://wepicks.net/phpsecurity-rentalserver/trackback/