11-1 共有サーバーの留意点 [PHPセキュリティー]
共有サーバー
- 共有サーバーに設置したファイルはすべて流出の危険がある
- 顧客情報など機密性の高い情報を扱う場合は共有サーバーは避ける
共有サーバーは複数のユーザーで一つのサーバーを使用しる共有型ホストです。共有サーバーは専用サーバーのように物理的に隔離されていないので、顧客情報や機密性の高い情報を扱う場合は避けるべきでしょう。共有サーバーに設置したファイルのソースコードは、すべて流出する可能性があると考えた方がよいでしょう。ドキュメントルートの外側に格納したファイルでも流出の可能性はあります。
データベースの利用
- 機密性の高い情報は全てデータベースに格納
- データベースへのアクセス認証ファイルの機密性が重要
- データベースへのアクセス認証ファイルのフォルダ名はmd5
- データベースへのアクセス認証ファイルへは root か 自分 のみに読み出し制限
共有サーバーの場合、機密性の高い情報は全てデータベースに格納する必要があります。その場合、データベースへのアクセス認証ファイルの機密性が重要になります。認証ファイルはドキュメントルート以外に設置し、格納するフォルダ名も md5 なので作成した見分けにくいフォルダ名にしましょう。また、認証ファイルは root や 自分 だけが読み出だせる設定にしましょう。
データベースアクセス証明書を次のフォーマットで設置する。
rootユーザーに制限
1 2 | SetEnv DB_USER "myuser" SetEnv DB_USER "mypass" |
自分だけに制限
1 2 3 | $ chmod 600 database.conf $ ls database.conf -rw------ 1tryphp tryphp 48 May 20 10:00 database.conf |
セッションデータの漏洩
- セッションデータをデータベースに格納する
PHPのセッションデータが格納されるセッションデータコンテナは、通常 /temp の中に格納されます。この /temp はすべてのユーザから書き込みが出来ます。共有サーバーの場合は、 /temp フォルダを複数のユーザーがセッションデータを書き込んでいる場合もあります。セッション変数で機密情報を扱っている場合は非常に危険です。実際、共有サーバーで他のユーザーのセッション変数の内容を盗み見るスクリプトなど直ぐに書けるでしょう。
セッションデータをデータベースに格納することでセッションデータの漏洩を回避できます。また、データベースに格納することでセッションインジェクションのような危険な攻撃への防護策にもなります。
テーブルの作成
1 2 3 4 5 6 7 | //テーブルの作成 create table sessions( id varchar(32) NOT NULL, access int(10) unsigned, data text, PRIMARY KEY (id) ); |
セッションデータをデータベースに格納する関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | <?php //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); } ?> |
SESSIONの呼び出し
1 2 3 4 5 6 7 8 9 10 11 | <?php session_set_save_handler( '_open', '_close', '_read', '_write', '_destroy', '_clean' ); session_start(); ?> |
タグ(=記事関連ワード)
日付
最終更新日:2017年08月09日