「PHP/Webアプリケーション向けの機能」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎どこがダーティーか?: このコードには以下のような欠点があり、アジャイルにはともかく実務には使えません。 スクリプトに認証情報がハードコードされている サーバーに侵入されなければ、JavaScript のように丸見えにはなりませんが「サーバーに侵入されない」前提で認証関係のコードを書いてはいけません。 メソッドを拠り所にフォームと認証を切り替えている 細工したユーザーエージェントからならば、メソッドを自由に切替えてチャレンジできます。 チャレンジ回数に限界がない ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
クッキーを使ったセッション管理の基礎的な問題(セッションIDを処理系に生成させていない)などが山盛りなので削除。また国や地域によってはクッキーを受け取ることを承諾しない限りクッキーをセットできないので、セッション管理に使うべきか議論がある。
タグ: 2017年版ソースエディター
102 行
# チャレンジ回数に限界がない
#* ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
 
== クッキーの入れ方 ==
クッキーを使う前に、まずはメインページを作る必要があります。
 
wikibooksでも、メインページに、もしログアウトしている状態もしくは未登録の状態でアクセスすれば「ログインしていません」と右上あたりに表示されているのと同様です。
 
* メイン画面の例
まず、私たちの自作するメインページは、おおむね下記のようなコードになるでしょう。
 
;メイン画面のコード(PHP)
<syntaxhighlight lang="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>
</syntaxhighlight>
 
 
当然、最初にこのページを表示したとき、まだクッキーを作ってないので、「ログインしていません」と表示されます。
 
hrefタグは、文章や画像などにクリック時に別ページにリンクする機能をつけるためのプロパティです。HTMLのどの入門書にも hrefタグは解説が書いてあるので、本PHP教科書ではhrefの説明は省略します。
 
 
 
さて、上記メインページから、ログイン画面に映ります。
 
* ログイン画面の例
ログイン画面のコードは、すでに前の節で作成したのと同じで構いません。下記にコードを再掲します。
 
;ログイン画面のコード
<syntaxhighlight lang="PHP"><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>
</syntaxhighlight>
 
 
ログイン画面では、まだクッキーは作成'''しない'''です。
 
 
クッキーを作成する時期は、ログインに成功'''したあと'''です。
 
 
 
* ログイン成否の確認画面の例
さて、ログインの成否の確認画面が、下記のように変わります。
 
<syntaxhighlight lang="PHP"><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>
</syntaxhighlight>
 
setcookie()関数で、クッキーをブラウザに与えます。
 
書式は
<code>setcookie(クッキー名, 値, time() + 時間 ); </code>
です。
 
 
上記コードでは、安全のため、30秒の経過でクッキーが消失するようにしています。
 
つまり
:<code>setcookie(クッキー名, 値, time() + 保存の秒数 ); </code>
という書式です。
 
なので、もし
:<code>setcookie(クッキー名, 値, time() + 30 ); </code>
なら、30秒でクッキー消失します。
 
 
たとえば
:<code>setcookie(クッキー名, 値, time() + 60*60*24*2 ); </code>
なら、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」をクリックすれば、開発版ブラウザが起動する。
 
 
== ※備考: クッキーのセキュリティ対策など ==
クッキーのデータはネットワーク経由で受け渡しされる。なので、念のために「盗聴」(データの覗き見)を第三者にされている事態も想定しておき、そのためクレジットカードの番号やパスワードなどといった機密情報については、けっしてクッキーでは受け渡しをしていはいけない。<ref> WINGSプロジェクト著『改訂新版 基礎PHP』、インプレスジャパン、2009年7月11日 第1版 第10刷発行、188ページ</ref> <ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>
 
よってクッキーでは、パスワードなどのある認証サイトのキーだけを受け渡しするようにするなどの注意が必要である。
 
また、もしもクッキーの内部に、ログインについてのYesまたはNo のような文字列を入れてその文字を読み取るようなログイン方式だと、不正ユーザーによって、文字列を書き換えされて不正ログインされる可能性があるので、別の方式にする必要がある<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>。
 
単に、ログインのキーだけを渡すのが良いだろう。
 
 
なお、一般にブラウザのクッキーの保管の容量には4キロバイトまでと制限があり<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>、もし容量オーバーすると古いクッキーから順に削除されていく方式である。
 
このため、大きな情報はクッキーには納めてはいけないし、納められない<ref> 山田祥寛『PHP入門教室』、翔泳社、2012年9月13日 初版 第1刷発行、205ページ </ref>。
 
アカウント設定などの情報は、クッキーには含めないでおくのが、実務的にもマナー的にも望ましいだろう。アカウント設定などはサーバー側でデータベースなどで保管しておこう。セキュリティ的にも、サーバー側で保管するのが安全である。
 
 
== 厳密な等価演算子<nowiki>===</nowiki> ==