「PHP/Webアプリケーション向けの機能」の版間の差分
※備考: クッキーのセキュリティ対策など |
→※備考: クッキーのセキュリティ対策など: クッキーの容量制限について「4キロバイト」と追記。 |
||
285 行 | 285 行 | ||
なお、一般にブラウザのクッキーの保管の容量には限 |
なお、一般にブラウザのクッキーの保管の容量には4キロバイトまでと制限があり<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>、もし容量オーバーすると古いクッキーから順に削除されていく方式である。 |
||
このため、大きな情報はクッキーには納めてはいけないし、納められない<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>。 |
このため、大きな情報はクッキーには納めてはいけないし、納められない<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>。 |
||
アカウント設定などの情報は、クッキーには含めないでおくのが、実務的にもマナー的にも望ましいだろう。アカウント設定などはサーバー側でデータベースなどで保管しておこう。セキュリティ的にも、サーバー側で保管するのが安全である。 |
アカウント設定などの情報は、クッキーには含めないでおくのが、実務的にもマナー的にも望ましいだろう。アカウント設定などはサーバー側でデータベースなどで保管しておこう。セキュリティ的にも、サーバー側で保管するのが安全である。 |
||
== 参考文献 == |
== 参考文献 == |
2020年5月15日 (金) 03:26時点における版
原理
条件分岐とは何かについては、説明しません(中学校の技術家庭科や、高校の情報科目などで習っているハズです)。
もし実用的に、PHPで条件分岐をする際は、よくある例として、ウェブサイト画面になにかの入力欄があって、その入力値をもとに条件判定することになるでしょう。
例
今回は応用例として、なにかの会員制サイトのログイン画面を考えてみます。
HTMLフォーム画面は、原理的には、下記のようになるでしょう。
- HTMLコード例
<form action="logincatchTest.php" method="post" >
ユーザー名: <input type="text" name="username1" id="box_user" ><br>
パスワード: <input type="text" name="password1" id="box_pass" ><br>
<input type="submit" value="ログイン" id="button1">
</form>
上記コードは、HTML側の画面です。
実行すると(あるいはサーバーにアップロードしてブラウザでアクセスすると)、下記のような画面になります。
- ユーザー名:
- ログイン名:
- ログイン
ボタン「ログイン」を押すと、ページが「logincatchTest.php」の生成するhtmlページに切り替わる仕組みです。(ブラウザの受け取る 切り替え先ページ のソースコードは htmlページ です。 たとい拡張子に「.php」とついていても、中身はphpではなくhtmlです。)
さらに条件分岐をするためにPHPのコードが必要です。
プログラム例として、もしユーザー名とパスワードとが正しければ、「ログイン成功」と出るプログラムを考えてみましょう。
下記のようなPHPコードをサーバー(のドキュメントルートのフォルダ、apacheなら具体的には /var/www/html)にアップロードすることになります。
- PHPのコード
<?php
if( $_POST['username1'] == "yamada" && $_POST['password1'] == "aikotoba" ){
echo "ログイン成功。<br>" ;
}
else {
echo "やりなおしてください。ログインに失敗しました。<br>" ;
echo $_POST['username1'],"と入力されました。<br>" ;
}
?>
のようなコードになります。
説明の簡単化のため、あらかじめユーザー名とパスワードは登録されているとします。登録されているユーザー名は「yamada」、登録されているパスワード「aikotoba」(合言葉)とします。
さて、webブラウザで、上記の(PHPファイルでなく)htmlファイルのウェブページを見に行ってください。
ログイン成功。
と表示されている画面で、ブラウザのソースコード閲覧機能を使っても、
ログイン成功。<br>
としか表示されません。
ソースコードを見ても、if文は、どこにも書かれていません。(JavaScriptの文法には if文 がある。)
またPHPは、サーバーで公開しても、JavaScriptのコードには変換されないです。
このようにPHPは、サーバーで公開しても、コードを素のHTMLにしか変換しないです。
また、webブラウザで直接アドレス指定して、上記コード例の場合なら
http://localhost/logincatchTest.php
などに移動しても
やりなおしてください。ログインに失敗しました。 と入力されました。
とブラウザ画面に表示されるだけです。
また、そのwebページのソースコードをブラウザのソース閲覧機能で見ても、
やりなおしてください。ログインに失敗しました。<br>と入力されました。<br>
とhtmlソースコードが表示されるだけです。
このように、PHP側のプログラムは、一切、ブラウザ側には送られず、よってブラウザにはPHPのソースコードは表示されません。さらに、JavaScriptにも変換されてない事に注目してください。
ブラウザで表示されているソースコードは、素のhtmlタグに変換されたあとのhtmlソースコードです。
なので、パスワードのような機密情報を、冒頭のようなPHPのコードだけでも守ることができます。
実務との違い
ただし、実際の応用の際には、より慎重を期して、パスワードなどの機密情報のあるファイルは、ドキュメントルートよりも上側のフォルダに置くなどします。
そして、そのパスワードのファイルとの送受信をすることで、パスワードの成否の判定をします。
しかし本書では説明の単純化のため、冒頭のPHPコード例では、PHPコード内にパスワードの答えを含めました。
なお、一般にwebサイトにログインした場合には、ブラウザに「クッキー」といわれるログイン情報などを残す必要があります。これは setcookie()
というPHPの組み込み関数、およびPHPのスーパーグローバル変数 $_COOKIE で可能です。
また、ブラウザにクッキー変数が存在しているかどうかは、isset()というPHP関数で調べられます。
その他、実務と手本のコードの相違点として、一般の会員制サイトでは、入力ボックスに何も入力されていない段階では、「ログイン」ボタンなどを押せないようになっていますが、その機能の実装はJavaScriptで出来ます。JavaScriptのif文や、onKeyUpプロパティなどを使えば、ボタンを押せない機能を実装できます。(詳しくはwikibooks『JavaScript/イベント処理』を参照してください。)
さらにMySQLなどのデータベース・ソフトウェアを使うことで、ユーザー名やらパスワード名などの会員情報は、MySQLなどに保管します。実務では、あまり、PHPのコード内やテキストファイルなどで直接にパスワードなどを保管することは無いです。
クッキーの入れ方
クッキーを使う前に、まずはメインページを作る必要があります。
wikibooksでも、メインページに、もしログアウトしている状態もしくは未登録の状態でアクセスすれば「ログインしていません」と右上あたりに表示されているのと同様です。
- メイン画面の例
まず、私たちの自作するメインページは、おおむね下記のようなコードになるでしょう。
- メイン画面のコード(PHP)
<?php
$kukiFlag = $_COOKIE['kukites1'] ;
if(isset($kukiFlag)) {
echo "ログイン中。<br>" ;
}
else {
echo "ログインしていません。<br>" ;
}
?>
<html>
<body>
<a href="loginTest.html">ログイン</a> <br>
<br>
<p>(※ ここにメインコンテンツの表示の予定。)</p>
</body>
</html>
当然、最初にこのページを表示したとき、まだクッキーを作ってないので、「ログインしていません」と表示されます。
hrefタグは、文章や画像などにクリック時に別ページにリンクする機能をつけるためのプロパティです。HTMLのどの入門書にも hrefタグは解説が書いてあるので、本PHP教科書ではhrefの説明は省略します。
さて、上記メインページから、ログイン画面に映ります。
- ログイン画面の例
ログイン画面のコードは、すでに前の節で作成したのと同じで構いません。下記にコードを再掲します。
- ログイン画面のコード
<form action="logincatchTest.php" method="post" >
ユーザー名: <input type="text" name="username1" id="box_user" ><br>
パスワード: <input type="text" name="password1" id="box_pass" ><br>
<input type="submit" value="ログイン" id="button1">
</form>
ログイン画面では、まだクッキーは作成しないです。
クッキーを作成する時期は、ログインに成功したあとです。
- ログイン成否の確認画面の例
さて、ログインの成否の確認画面が、下記のように変わります。
<form action="logincatchTest.php" method="post" >
<?php
if( $_POST['username1'] == "yamada" && $_POST['password1'] == "aikotoba" ){
setcookie("kukites1", "123",time()+ 30 ); // 30秒の保存期間
echo "ログイン成功。<br>" ;
}
else {
echo "やりなおしてください。ログインに失敗しました。<br>" ;
echo $_POST['username1'],"と入力されました。<br>" ;
}
?>
<html>
<body>
<br>
<a href="kukiTesM.php">メインページに戻る</a> <br>
</body>
</html>
setcookie()関数で、クッキーをブラウザに与えます。
書式は
setcookie(クッキー名, 値, time() + 時間 );
です。
上記コードでは、安全のため、30秒の経過でクッキーが消失するようにしています。
つまり
setcookie(クッキー名, 値, time() + 保存の秒数 );
という書式です。
なので、もし
setcookie(クッキー名, 値, time() + 30 );
なら、30秒でクッキー消失します。
たとえば
setcookie(クッキー名, 値, time() + 60*60*24*2 );
なら、2日間、クッキーが残ります。ぴったり2日間経過した直後の瞬間に、クッキーが消えます。
30秒でクッキー消失します。
さて、上記コードでは、 またクッキーとは別に、ログイン成功したあとにメインページに戻る機能も必要なので、hrefタグでメインページに戻るリンク文も追加しています。
なお、上記コードでは実はログイン失敗しても「メインページに戻る」リンク文が表示されるのですが、説明の単純化のため、上記コードのままにします。(クッキー以外のif文が増えると、説明がややこしくなるので。)
- 実験例
では、上記3個のページのコードすべてが完成したら、ローカルサーバーにアップロードしてみて、ブラウザからメインページにアクセスしてみてください。
そして、ログインしてください。ユーザー名「yamada」、パスワード「aikotoba」です。
ログイン成功したら、すぐに30秒以内にリンク文を押して、メインページに移動してください。
そして、メインページの表示中に、キーボードのファンクションキーのF5ボタンを押して、リロードしてください。
30秒以内なら、クッキーが保存中なので「ログイン中」とメインページで表示されます。
さて、F5ボタンを飽きるまで、何回か押して、なんどかリロードして、いろいろと試してください。
もし30秒経過後にリロードすると、もはやクッキーが消失しているので「ログインしていません」と表示されます。
- 備考
実際のwebブラウザでは、PHPのコードで指定した値(上記コードの場合なら「123」)のほかにも、さまざまな情報がwebブラウザ側で自動的に保存される。アクセス日時、作成日時、有効期限などの情報や、諸設定に必要な情報が保存されている。
この事を確認するには、Firefoxの場合、通常版Firefoxでは確認が不可能であるので、開発者用の Firefox Developer Edition を使う必要がある。(通常版 Firefox では、クッキー名の一覧は見れるが、しかしクッキー内部を見ることができない。)
開発者用Frirefoxでの 三本アイコン > 「ウェブ開発」>「ストレージインスペクター」で、クッキーのブラウザに保管された状態での中身を見ることができる。 (まぎらわしいことに「インスペクター」というメニューも近くにあるが、それではなく、「ストレージインスペクター」を選ぶ必要がある。)
なお Linux の場合 インストールは不要で、単に Firefox 公式サイトからダウンロードしてきて解凍し、ファイル内にある実行ファイル「Firefox」をクリックすれば、開発版ブラウザが起動する。
※備考: クッキーのセキュリティ対策など
クッキーのデータはネットワーク経由で受け渡しされる。なので、念のために「盗聴」(データの覗き見)を第三者にされている事態も想定しておき、そのためクレジットカードの番号やパスワードなどといった機密情報については、けっしてクッキーでは受け渡しをしていはいけない。[1] [2]
よってクッキーでは、パスワードなどのある認証サイトのキーだけを受け渡しするようにするなどの注意が必要である。
また、もしもクッキーの内部に、ログインについてのYesまたはNo のような文字列を入れてその文字を読み取るようなログイン方式だと、不正ユーザーによって、文字列を書き換えされて不正ログインされる可能性があるので、別の方式にする必要がある[3]。
単に、ログインのキーだけを渡すのが良いだろう。
なお、一般にブラウザのクッキーの保管の容量には4キロバイトまでと制限があり[4]、もし容量オーバーすると古いクッキーから順に削除されていく方式である。
このため、大きな情報はクッキーには納めてはいけないし、納められない[5]。
アカウント設定などの情報は、クッキーには含めないでおくのが、実務的にもマナー的にも望ましいだろう。アカウント設定などはサーバー側でデータベースなどで保管しておこう。セキュリティ的にも、サーバー側で保管するのが安全である。