カテゴリー別アーカイブ: 汎用テク覚え書き

フォーム入力のサニタイジングを行う(PHP編)

ユーザの入力をフォームで受け付けWEBページに出力する処理を含んだプログラムでは、入力値のサニタイジング(無害化)が必要です。WEBブラウザは表示内容にhtmlタグが含まれているとこれを自動的に解釈して反映してしまうため、悪意あるユーザがタグを混入させた入力を行えば、表示出力段階で設計者の想定外の処理が行われてしまうからです。
実例を見てみましょう。たとえば以下のような簡単なプログラムがあったとします。

<html>
<head>
<title>sample.php</title>
</head>
<body>
<?php
echo $_POST["userin"];
?>
フォームへの入力値を表示する
<form action="sample.php" method="post">
<input type="text" name="userin"></input>
<input type="submit" value="送信"></input>
</form>
</body>
</html>

このプログラムのユーザ入力に、<h1>このページの内容は嘘八百である</h1>というタグ付きテキストを渡してみます。するとh1タグが解釈され、目立って大きなテキストとして表示されてしまいます。たとえば掲示板プログラムなど、ユーザ入力が残り続けるページの場合にはこの「このページの内容は嘘八百である」という文言が残り続け、h1タグが付いているため検索エンジンにもこれがページの主要内容と誤解されてしまいます。さらに掲示板の背景色と同じ文字色をタグで指定すれば、管理者にも容易に気付かれずこの文言が残り続けることになります。

また、タグが解釈されてしまうということはscriptタグに挟んだ任意のスクリプトも実行できてしまうということです。ユーザの情報をクッキーに保存しているサイトで、<script>alert(document.cookie);</script>と入力すれば、scriptタグ中のjavascriptが処理され、クッキーに保存されたユーザ情報にアクセスできてしまいます。
この脆弱性と、アドレスにフォームへの入力内容を付加できるという特性を利用して行われるのがXSS(クロスサイトスクリプティング)です。この場合攻撃者(Aとします)は攻撃対象サイト(B)のアドレスにフォーム入力内容を加えたリンクを、悪意の無いユーザ(C)に踏ませます。クッキーに格納されたユーザ(C)の情報はスクリプトにより攻撃者(A)に取得され、たとえばそれがパスワードであった場合には不正アクセスが可能になってしまいます。さらにクッキーに保存された情報の種類によっては、もっと深刻な個人情報の漏洩にもなり得ます。

このような攻撃への対策として行われるのがサニタイジングです。htmlタグを示す<や>といった文字をエスケープして他の文字列を充てるという処理で、PHPにはそれを行う関数が幾つか存在します。以下それらの関数個別の説明を行います。

strip_tags関数

この関数はその名の通り、htmlとPHPのタグを文字列から取り除きます。また2番目の引数として特定のタグを与えることで、そのタグは取り除かないといった指定もできます。一見便利そうですが、タグであるとの判定が<と>に囲まれているということなので、ユーザ入力として閉じてないタグ(例:<script)を与えられると、遥か先に存在する>を探し出してそこまでの文字列を全て取り除いてしまうという可能性があり諸刃の剣です。

addslashes関数

この関数がエスケープするのはタグを構成する文字ではなく、シングルクォート、ダブルクォート、スラッシュといったデータベース操作のSQL文を構成する要素です。これはSQLインジェクションという攻撃への対策であり、このエントリの内容からは外れるのですが、ここで言及するのはこの機能をデフォルトでオンにしているレンタルサーバが多いからです。
正確にはPHP設定のmagic_quotes_gpcという項目名のもので、これがonになっていると自動的にフォーム入力値にaddslashes関数が実行されるというものです。先程のフォーム入力表示プログラムにエスケープ対象になる文字列を入力して、バックスラッシュや¥マークが付加されて表示される場合はこれが有効になっています。ある意味この自動エスケープも入力内容の予期せぬ改変を引き起こすと言えなくもなく、またSQLインジェクションへの対策という点から見てもこの機能は不完全ですので、PHPの最新ヴァージョンでmagic_quote_gpcが廃止されるなどの動きもあるようです。この辺りの話はまたSQLインジェクションについてのエントリを立てて説明します。

htmlspecialchars関数

この関数は、htmlタグを構成する<と>、&、設定によってはシングルクォートとダブルクォート、以上の5種類に対しエスケープを行ってくれる関数です。&に何故エスケープが必要かというと、この文字はエスケープ変換後の文字列の先頭に現れエスケープの表明になるからです。たとえば<をエスケープすると&lt;という文字列になります。シングルクォート、ダブルクォートについても、CSSでの値指定で使われる文字で、これを利用した攻撃方法が存在するのでエスケープの必要があります。デフォルトではダブルクォートのみエスケープという指定になっているので、この関数を利用する際には引数を与えシングルクォートのエスケープも有効にしなければなりません。以下は書式です。

htmlspecialchars(引数1,引数2,引数3);
/*
引数1:変換対象文字列
引数2:(省略可)クォートの扱い。0〜3の整数値または定数で指定。
定数ENT_QUOTESを与えると両方変換する。
引数3:(省略可)文字コード。UTF-8など明示的に指定しておいた方が良い。
*/

この関数を常に使うのが有効な対策です。

htmlentities関数

htmlspecialchars関数と同じく文字列を&lt;のようにエスケープしてくれるのですが、対象文字がエスケープ可能な全ての文字にわたります。ウムラウト付き文字やギリシャ文字、記号類が主な対象です。全てのリストは、htmlの特殊文字などで検索して調べて下さい。
この関数をhtmlspecialchars関数の代わりに使うこともできます。ただやはりクォートのエスケープのデフォルト値はダブルクォートのみなので、第二引数にENT_QUOTESを与えて下さい。

ユーザからの入力を表示するプログラムにサニタイジングが必要ということは、前回作成したようなファイルアップロードを受け付けるプログラムでも適切なエスケープが必要になります。ファイルから読み込んで表示する部分にエスケープするのは勿論ですが、$_FILES変数の$_FILES[][‘type’]、$_FILES[][‘name’]などについても、ユーザが任意の値を設定できるため、エスケープするべきです。

以上がPHPでのサニタイジングです。サニタイジング以外にも、ファイル構成や入力チェックなどでセキュリティを上げることが可能ですので、その方面での対策と常にセットで考えておきましょう。


fgetcsvで読み込んだCSVファイルをhtmlのテーブルとして出力

タイトルどおり、fgetcsv関数で読み込んだCSVファイルをテーブルにします。
PHPの動くサーバに設置してローカルのファイルを求める仕様です。サニタイジングを省略しているので公開領域には置かないでください。

csvtotable.php
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h2>テーブル表示するcsvファイルを指定して下さい。</h2>
<form enctype="multipart/form-data" action="csvtotable.php" method="POST" />
<input type="file" name="csvfile" accept="application/excel" />
<input type="submit" value="送信" />
</form>
<br />
<?php
if(isset($_FILES["csvfile"])){
if($fp = fopen($_FILES["csvfile"]["tmp_name"],r)){
echo '<table border = "1">';
while(($row = fgetcsv($fp)) != false){
echo "<tr>";
for($i = 0; $i < count($row); $i++){
echo "<td>" . mb_convert_encoding($row[$i],"UTF8","SJIS-win") . "</td>" ;
}
echo"</tr>";
}
echo "</table>";
}
}
?>
</body>
</html>

エクセルで作成されたShift-JISのCSVファイルを読み込むという設定で、fgetcsvで読み込んだ値をいちいちmb_convert_encoding関数でShift-JISからUTF-8に変換して表示しています。この関数は引数1に変換対象の文字列、引数2に変換後エンコーディング、引数3に変換元エンコーディングを与えるのですが、変換元としてただのShift-JISを与えたケースでは、”かっこかぶ”やローマ数字などが表示できませんでした。SJIS-winと指定するのが正解なようです。
なお、このプログラムで上手く表示できない場合は前回説明したような問題が発生している可能性もあります。記事を参考にしてあたりをつけてみて下さい。


PHPでCSVファイルの読み込み/書き出しをする

表計算ソフトやデータベースなどのデータの受け渡しに使うフォーマットとして、CSVというフォーマットがあります。このフォーマットはCSV(Comma-Separated Values)の名前のとおり、複数の値をカンマで区切っただけのテキストファイルで、書式さえ理解していれば特別なソフトを使わずに作成や修正をすることができるので便利です。今回はこのフォーマットの書式の説明と、PHPで読み込んで配列に格納または出力する関数の紹介をします。

CSVの書式

CSVでは値の区切りをカンマで、データ行の区切りを改行コードで行います。たとえば表計算ソフトで以下のような表があったとします。

世界ランキング 名前 コメント
1 みかん 「次も頑張ります」
2 りんご 「妥当な結果です」
3 メロン 「スタートに失敗した。このまま腐ってしまっては仕方が無い」

この表をCSVファイルとして出力すると、次のようなテキストファイルが生成されるはずです。

世界ランキング,名前,コメント
1,みかん,「次も頑張ります」
2,りんご,「妥当な結果です」
3,メロン,「スタートに失敗した。このまま腐ってしまっては仕方が無い」

値の区切りがカンマで示され、行の区切りが改行で示されているのがわかります。値は”みかん”のように、ダブルクォーテーションで囲んでも構いません。ですが、注意すべきケースが3つ程存在します。

  1. 値がカンマを含んでいるケース
  2. 先述の通りカンマは値同士の区切りとして特別な意味を持ちますので、値自体にカンマが含まれている場合、それが区切り文字でないことを明示しなければなりません。そこで先程値を囲むのに使ってもよいと書いたダブルクォーテーションで、カンマを含んだシーケンスを挟んでそれが一つの値であると明示するのに使います。たとえば「スタートに失敗した,このまま腐ってしまっては仕方が無い」という値を、次のように囲みます。

    3,メロン,"「スタートに失敗した,このまま腐ってしまっては仕方が無い」"
    
  3. 値が改行を含んでいるケース
  4. 値が改行を含んでいる場合にも、それが列の区切りではないと明示しなければなりません。この場合もダブルクォーテーションで囲むという方法が使えます。
    「スタートに失敗した。
    このまま腐ってしまっては仕方が無い」
    という値の表記例を見てみましょう。

    3,メロン,"「スタートに失敗した。
    このまま腐ってしまっては仕方が無い」"
    
  5. 値がダブルクォーテーションを含んでいるケース
  6. 値にダブルクォーテーションが含まれている場合には、それが値の一部であって表記規則の一部でないことを明示しなければなりません。そのためにはまず値全体をダブルクォーテーションで括り、さらに値中のダブルクォーテーションは2つ重ねることによって間違って解釈されることを回避します。”スタートに失敗した。このまま腐ってしまっては仕方が無い”という値は、以下のように表記します。

    3,メロン,"""スタートに失敗した。このまま腐ってしまっては仕方が無い"""
    

    なぜダブルクォーテーションが3つ連続しているのかは、順序立てて考えると分かり易いです。大切な規則は、ダブルクォーテーションを使う場合かならず値の一番外側はダブルクォーテーションで囲まなければならないということです。

以上が基本的なCSVの書式になりますが、ソフトによって方言や独自の拡張文法も存在しています。が、国際標準として成文化されたルールは上記のものになりますので、データの広い受け渡しを想定するならばこのルールに倣っておきましょう。

PHPでのCSVファイルの取り扱い

PHPでは、CSVファイルを読み込んで二次元配列に格納する関数fgetcsvがヴァージョン4から、二次元配列をCSVのフォーマットに整形してファイルに書き込むfputcsvがヴァージョン5.1から存在しています。それぞれの書式は以下のようになります。

fgetcsv(引数1,引数2,引数3,引数4,引数5);
/*ここからコメント
引数1はfopenなどで取得したファイルポインタ。
引数2以降は省略可能。
引数2 = 行の最大長
引数3 = 値の区切り文字(デフォルトはカンマ)
引数4 = 値の囲い文字(デフォルトはダブルクォーテーション)
引数5 = エスケープ文字(デフォルトはバックスラッシュ)
*/
fputcsv(引数1,引数2,引数3,引数4);
/*
引数1 = ファイルポインタ
引数2 = 値の二次元配列
以下省略可
引数3 = 値の区切り文字(デフォルトはカンマ)
引数4 = 値の囲い文字(デフォルトはダブルクォーテーション)
*/

ただしfgetcsvの方は、値が日本語のときに上手く読み込めないという事例がネット上でも多数報告されています。どうもExcelなどのCSVの作成元が日本語文字コードにShift-JISを採用していて、PHPでユーザが設定している文字コードがEUC-JPまたはUTF-8という状況でのエラーが多いようです。さらに調べると、fgetcsv関数は文字コードの処理時に、default_charsetではなくPHPのロケール設定という利用者の地域設定を参照するようで、setlocaleという関数を使って地域と使用文字コードを明示的に設定してやらなければならないようです。

setlocale(LC_ALL, "ja_JP.UTF-8");
/*
setlocale関数の書式
setlocale(引数1,引数2);
引数1 = ロケール設定が適用される関数のカテゴリ。
とりあえずLC_ALLを指定すると適用できる全ての関数に有効になる。
引数2 = ロケール名
ja_JPまでがロケール名だが、ドットの後ろに文字コードまで指定できる。
*/

このsetlocale関数を用いて、Shift-JISのCSVファイルをUTF-8環境に読み込み表示するプログラムを個人的に実行してみました。が、結果として当方の環境ではやはり文字化けが起こってしまいました。したがって、当面の対策としては、エラーを避けるためにCSVファイルの方を整形してからプログラムに読み込ませるという方法を採用しています。具体的には、値をダブルクォーテーションで必ず囲むようにする、CSVファイルの文字コードをPHPでのエンコーディングに変換して保存し直すなどです。
CSVでのデータ受け渡しができることには計り知れないメリットがあるので、この問題が早々に解決してくれることを期待します。


サイトC:PHPの各種設定をphp.iniではなく.htaccessで行う

以前php.iniを使ったPHPの各種設定変更方法を書きました。しかしながら、レンタルサーバによってはユーザがphp.iniファイルを作成する事を許可してない場合があります。当方の場合、まさにサイトC(このサイト)を設置している000webhostがそうだったのですが、そういったケースではphp.iniファイルを使わず.htaccessファイルで設定の変更を行います。
.htaccessでPHPの設定を変更する場合、変更する値のタイプによって書き方が2種類存在します。具体的には、論理値を指定する場合に使うphp_flagと、それ以外の値を指定する場合に使うphp_valueです。そこで実際サイトCにおいて私が行った設定を例にしながら、2種類の書式を見てみましょう。

論理値を指定するタイプ

論理値を指定する場合というのは、PHPのオプション機能の有効/無効を指定する場合で、書式は次のようになります。

php_flag 設定項目 On
php_flag 設定項目 Off

繰り返しになりますが、文の最後には改行が必要です。実例として、PHPプログラムでエラーが発生した際の、エラーメッセージをブラウザに出力する設定をアクティブにしてみます。

php_flag display_errors On

このオプションが有効になっていると、実行したプログラムの何行目でどのようなエラーが起こったかを親切に表示してくれます。もちろんサイト訪問者側からもエラー内容が見えてしまうことになるので、必要の無いときにはOffを指定しておきましょう。

他の値(文字列、数値)を指定するタイプ

文字列や数値を指定する場合には、以下の書式を使います。

php_value 設定項目 設定内容

実例としてはphp.iniの解説で挙げたデフォルト文字コードの指定があります。これは.htaccessで設定する場合以下のようになります。

php_value default_charset UTF-8

UTF-8の部分をダブルクォーテーションで囲んでも適用されるようです。
数値の例としては、処理がタイムアウトになるまでの秒数であるmax_execution_timeを挙げます。

php_value max_execution_time 60

その他の設定項目も、この2種類の書式で指定することができます。どのような項目があるかはphpinfo()やPHPパッケージ付属のphp.iniで知ることができます。ただしレンタルサーバによっては特定の項目のユーザー側からの変更をブロックしている場合がありますので、そういう場合についてはあきらめて別の方法を模索しましょう。


.htaccessの書式とよく使う設定

Apacheの設定ファイル.htaccessを使用してできることは多岐にわたります。その中でも代表的で、サイト制作には割合必須な機能の紹介を、書式の説明と並行して行いましょう。

トップページにindex.html以外のファイルを指定する

たとえばhttp://www.○○○.com/というアドレスのサイトで、http://www.○○○.com/とだけアドレスバーに打ち込んで表示されるページは、ドキュメントルートに置かれたindex.htmlというファイルです。これは下位のディレクトリでも同様で、http://www.○○○.com/page/というアドレスで表示されるのは、ドキュメントルートに存在するpageディレクトリに置かれたindex.html、といったように、指定されたディレクトリに置かれたindex.htmlを探して表示するというのがhtml文書での約束事です。
一方、ページ中にPHPプログラムを含む場合に、ファイルの拡張子を.phpにしなければならないという約束事も存在します。トップページにPHPプログラムを置きたい場合など、ファイル名をindex.phpとしてしまうとブラウザでアクセスしてもよくわからないリストページが現れるだけで、柔軟に解釈してindex.phpを表示してくれたりはしません。そこでディレクトリ名のみをアドレス指定された場合に探すファイルを、以下のような記述で設定します。

DirectoryIndex index.php index.html

DirectoryIndexの部分が設定項目名、index.php index.htmlの部分が設定したい値です。つまり.htaccessの書式は以下のようになります。

設定項目名 値1 値2

php.iniの場合と異なり、設定項目と値の間を半角スペースで区切り、イコールはつけません。設定したい値が複数ある場合は、値同士をやはり半角スペースで区切ります。そして文の終わりには、たとえ設定項目が1つであったとしても改行が必要です。ちなみにコメントアウトは以前書いた通り#を使います。
DirectoryIndexの説明に戻りますと、値として指定された名称のファイルを、ディレクトリ名でアクセスされた場合表示します。さらに後ろに続けて値を与えると、最初に与えた値のファイル名が無かった場合に、次に探すべきファイル名と解釈します。上の例ならば、まずindex.phpを探して、無かったらindex.htmlを探して表示ということですね。ちなみに.htaccessの設定は下位ディレクトリにも反映されますので、こういった設定をドキュメントルートでしてしまうとわかりやすいです。

DirectoryIndexで指定されたファイルが存在しなかったときリスト表示になるのを避ける

先にindex.html無しでディレクトリのアドレスを入力してみたときの、よくわからないリストの出現を抑える方法です。

Options -Indexes

セキュリティの為にも、ファイル構成が外部から筒抜けになってしまうのは避けたいところです。公開サイトを段階的に大きくしていくケースでも、この設定は最優先でしてしまいましょう。

ディレクトリへのアクセスにパスワードをかける(Basic認証)

外部からアクセスされては困るディレクトリに、ユーザ名とパスワードを要求するタイプのプロテクトをかける事もできます。パスワードは.htpasswdというファイルに保存して、そのファイルへの参照を.htaccessで指定します。.htpasswdファイルはドキュメントルートより上の階層に置いて、まかり間違ってもそちらに外部からアクセスされないようにする必要があります。ユーザ名user、パスワードpassという例で書き方を説明します。

user:pass

こちらが.htpasswdファイルへの記述です。複数ユーザにも対応可能ですのでその場合は同ファイル内に羅列して書いてしまって構いません。そしてこちらも文の終わりの改行が必須です。

AuthName "hidden"
AuthUserFile "/home/usr/.htpasswd"
AuthType Basic
require valid-user

こちらが.htaccessの記述です。AuthNameという項目は、パスワードを求める領域の名称で、ダイアログの本文に現れます。特に意味はないので好きな名称を設定してください。AuthUserFileには.htpasswdファイルへのパスを与えます。なお.htpasswdのファイル名は自由に決められるようですので、パスの指定もそれに即して変えてください。AuthType Basicは認証の種類で、この他にDigestという値もとり得ますが、対応ブラウザが狭い、Apacheのヴァージョンにより書式が異なる部分が出るなどの問題があり、あまり積極的に採用されていないようです。最後のrequireでは複数ユーザが登録されていた場合に、アクセスを許すユーザを名指しで指定するというものです。vaLid-userにしておけば、全登録ユーザを許可します。
このBasic認証は少し面倒くさいでしょうか。ちなみに、cPanelではこのBasic認証の設定をPassword Protected DirectoriesというアイコンからGUIで行えます。ちゃんと.htpasswdをドキュメントルートより上に保存してくれるので便利です。

アクセスのリダイレクトを行う

指定されたパスにアクセスがあったとき、そのアクセスを別のアドレスに振り向けます。

Redirect permanent / http://www.google.com/

この例では、Redirect permanentの部分が設定項目名で、その後ろに値を2つ与えています。1つ目の値はただのスラッシュですが、これはドキュメントルートを指定して与えていると読んで下さい。もしドキュメントルート直下のpageディレクトリを与えたいなら/page/となります。2つ目の値はリダイレクト先のhttp://から始まるアドレスです。つまりこの例では、ホームページにアクセスされたらgoogle.comにジャンプするという結果になります。ホームページ移転などがあったときに、この設定を使って新ページにリダイレクトしましょう。

特定の拡張子のファイルへのアクセスを禁止する

さて、長々と説明してきてやっと前回予告した機能の説明に入ります。最後になってしまったのは、書式がこれまでのものといくらか異なるからです。拡張子.iniのファイルへのアクセスを禁止する例を見てみましょう。

<Files ~ "\.ini$">
deny from all
</Files>

htmlのような、タグで挟んだ書式になっています。しかし異なるのは、タグの終わりと文の終わりに改行を必要とするため、3行で1セットということです。最初のタグの中にあるバックスラッシュは、正規表現でのエスケープを表しています。windows環境では¥マークになりますね。正規表現全般については説明を省きますが、この項目でよく使いそうな指定としては、”または”を表す|(縦の一本棒)、前方一致を表す^、後方一致の$などがあります。それらを使って、拡張子が.iniおよびファイル名の先頭が.htのファイル(.htaccess、.htpasswd)へのアクセスを禁止してみます。

<Files ~ "\.ini$|^\.ht">
deny from all
</Files>

他にも特定プロバイダからのアクセス禁止や、カスタムエラーページの参照などできることは沢山あるのですが、ひとまずここでは解説を省きます。また.htaccessを使ったPHPの設定変更(php.iniを使用しない)については、独立したエントリに書くつもりです。


.htaccessを使ってphp.iniの有効範囲を拡張する

前回の続きです。ユーザ側で用意したphp.iniは、レンタルサーバ側で特別な設定をしていない限りその有効範囲が同ディレクトリ内に制限されます。つまりディレクトリを多数用意するサイト作りではユーザが作成するフォルダ毎にphp.iniを用意せねばならず、ファイル構成が冗長になってしまいます。そこでApacheの設定ファイルである.htaccessを使用して、任意の箇所に配置されたphp.iniファイルの設定が.htaccessファイルを置いたディレクトリと下位のディレクトリに適用されるように変更してみましょう。

.htaccessファイルの名前は拡張子も含めて.htaccessになります。テキストエディタなどで保存するとOSによっては不可視ファイルの扱いになってしまうので、適当な名前で保存してサーバにアップロードした後にFTPクライアントの機能でリネームするという方法が便利です。そして作成した.htaccessという名前のファイルにこのような記述をして、文の最後に改行を忘れずに入れて保存してください。

suPHP_ConfigPath /home/user/public_html/settings/

この例での/home/user/public_html/settings/の部分は、用意したphp.iniを置いているディレクトリのパスという設定です。各々のケースに合ったパスへと置換して下さい。このように設定しておくと、.htaccessを置いたパスと、それより下位のディレクトリで実行されたプログラムに/home/user/public_html/settings/に置いたphp.iniの設定が適用されるようになります。

なお.htaccessファイルもphp.iniファイルもただのテキストファイルですので、ブラウザからアクセスすると現在の設定内容が丸見えになってしまいます。それを避ける為にはApacheの特定の拡張子をもったファイルへのアクセスを禁止する機能を使うのですが、やはりそれも.htaccessファイルで設定することになります。次回はそれを含めた.htaccessの代表的な機能と書式を紹介することにします。


php.iniでPHPの各種設定を変更

PHPのデフォルト文字コードなどの各種設定は、php.iniというファイルで定義されています。レンタルサーバを契約してPHPを使用したサイトを作成する際には、まずプロバイダによる現在のphp.iniの設定をチェックしてみましょう。PHPの関数phpinfo()を使うと実行ディレクトリに適用されている設定を一覧にして表示してくれますので、ドキュメントルートに以下のように記述したファイルを保存しブラウザでアクセスします。

<?php
phpinfo();
?>

phpinfo()というタイトルのページが表示されれば成功です。PHPロゴの隣に現在のヴァージョン、その下の表では現在の設定内容がわかります。

表の項目Configuration_File (php.ini)Pathにはphp.iniファイルが置かれているディレクトリが、Loaded_Configuration_Fileには実際に読み込まれたファイルが示されています。レンタルサーバの場合Configuration_File (php.ini)Pathの項目で設定されたパスにユーザがアクセスを許されず、設定を変更しようとしてもそこにあるファイルに直接手を加えることができないことが多いですので、新たに設定済みのphp.iniファイルをPHPプログラムと同じディレクトリに作成します。
php.iniファイルの書式は以下のようになります。

設定項目 = 値

文の終わりは改行で示し、特別な文字はつけません。また、コメントアウトは;(セミコロン)を行頭につけて行います。例えばデフォルトの文字コードをUTF-8にしたいときは、以下のように記述します。

default_charset = "UTF-8"

その他にどのような設定項目があるのかの解説はここでは省きますが、PHPのパッケージに付属したphp.iniには、コメント行を活用した各設定項目の説明が英語で書かれていますので、既存のphp.iniをコピーして、説明を見ながら必要な設定項目だけ変更して保存するという方法が便利です。先程phpinfo()で調べたヴァージョンのphpを、http://www.php.net/からダウンロードし、展開したファイルの中からphp.ini-○○といったような先頭にphp.iniがついているファイルを見つけてください。後ろについている単語は用途にあわせた設定を表していますが、php.ini-recommendedがあればそれを、無ければphp.ini-productionをphp.iniにリネームして使用します。
これでphp.iniの入ったディレクトリに設定が適用された筈です。そのディレクトリ内のファイルでphpinfo()をやってみて、Loaded_Configuration_Fileが同ディレクトリ内のものに変更されていることを確認してください。

ユーザが配置したphp.iniの有効範囲はそのディレクトリ内のみですが、Apacheの設定ファイル.htaccessを使って有効範囲を広げることも可能です。次回はその方法の解説をします。