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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎シンプルでダーティーなログインフォーム: もし実用的に、PHPで条件分岐をする際は、よくある例として、ウェブサイト画面になにかの入力欄があって、その入力値をもとに条件判定することになるでしょう。 ここでは例として、会員制サイトのログイン画面を考えてみます。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎どこがダーティーか?: このコードには以下のような欠点があり、アジャイルにはともかく実務には使えません。 スクリプトに認証情報がハードコードされている サーバーに侵入されなければ、JavaScript のように丸見えにはなりませんが「サーバーに侵入されない」前提で認証関係のコードを書いてはいけません。 メソッドを拠り所にフォームと認証を切り替えている 細工したユーザーエージェントからならば、メソッドを自由に切替えてチャレンジできます。 チャレンジ回数に限界がない ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
タグ: 2017年版ソースエディター
62 行
</syntaxhighlight>
:: スーパーグローバル変数 <var>$_POST</var> が(間違っていないかではなく)あるのかをテストして、なければGETメソッドと判断しています。
:GETメソッドならばフォームを生成します。
::<syntaxhighlight lang=text>
<!-- GET Method -->
<form action="index.php" method="POST"">
<div><label for="username">ユーザー名:</label><input type="text" name="username" id="username"></div>
<div><label for="password">パスワード:</label><input type="password" name="password" id="password"></div>
<input type="submit" value="ログイン">
</form>
</syntaxhighlight>
::を生成します。
:POSTメソッドならば
::ユーザー名とパスワードの両方が一致したら
::<syntaxhighlight lang=text>
::<code><p>ログイン成功</p></code>を生成します。
<!-- POST Method -->
<p>ログイン成功</p>
</syntaxhighlight>
::を生成します。
::片方でも一致しなければ
::<syntaxhighlight lang=text>
::<code><p>ユーザー名 または パスワード が違います。<p></code>を生成します。
<!-- POST Method -->
<p>ユーザー名 または パスワード が違います。<p>
</syntaxhighlight>
::を生成します。
:::(ここでどちらが不一致だったかを教えてはいけません。ブルートフォース攻撃が格段に易しくなります。)
 
; ファームのレンダリング例
<span style="font-size:1.1rem">ユーザー名:</span><span style="border:2px solid #333;border-radius:4px;background-color:#fff;padding:1px;font-weight: bold">         </span>
<div><span style="font-size:1.1rem">パスワザー名:</span><span style="border:2px solid #333;border-radius:4px;background-color:#fff;padding:1px;font-weight: bold">         </span></div>
<div><span style="borderfont-size:1.1rem">パスワード:</span><span style="border:2px solid #333;;border-radius:4px;background-color:#fff;padding:1px;font-weight: 8pxbold">登録         </span></div>
<div><span style="border: 2px solid #333;;border-radius:4px;padding:1px 8px">登録</span></div>
 
----
 
;PHPのコード
<syntaxhighlight lang="PHP">
<?php
 
if( $_POST['username1'] == "yamada" && $_POST['password1'] == "aikotoba" ){
echo "ログイン成功。<br>" ;
}
 
else {
echo "やりなおしてください。ログインに失敗しました。<br>" ;
echo $_POST['username1'],"と入力されました。<br>" ;
}
 
?>
</syntaxhighlight>
 
のようなコードになります。
 
PHPで条件分岐を使うにはif文を使います。if文とは、「もし~~ならば、〇〇せよ」という命令を実行する文です。
 
いっぽう、else文は、「もし~~で'''なければ'''、〇〇せよ」という命令を実行する文です。
 
他の多くのプログラム言語でも、if文とelse文は同様の機能です。
 
 
説明の簡単化のため、あらかじめユーザー名とパスワードは登録されているとします。登録されているユーザー名は「yamada」、登録されているパスワード「aikotoba」(合言葉)とします。
 
 
さて、webブラウザで、上記の(PHPファイルでなく)htmlファイルのウェブページを見に行ってください。
 
ログイン成功。
と表示されている画面で、ブラウザのソースコード閲覧機能を使っても、
 
 
<syntaxhighlight lang="html5">
ログイン成功。<br>
</syntaxhighlight>
としか表示されません。
 
 
ソースコードを見ても、if文は、どこにも書かれていません。(JavaScriptの文法には if文 がある。)
 
またPHPは、サーバーで公開しても、JavaScriptのコードには変換'''されない'''です。
 
このようにPHPは、サーバーで公開しても、コードを素のHTMLにしか変換しないです。
 
 
 
また、webブラウザで直接アドレス指定して、上記コード例の場合なら
http://localhost/logincatchTest.php
などに移動しても
やりなおしてください。ログインに失敗しました。
と入力されました。
とブラウザ画面に表示されるだけです。
 
また、そのwebページのソースコードをブラウザのソース閲覧機能で見ても、
<syntaxhighlight lang="html5">
やりなおしてください。ログインに失敗しました。<br>と入力されました。<br>
</syntaxhighlight>
とhtmlソースコードが表示されるだけです。
 
 
 
このように、PHP側のプログラムは、一切、ブラウザ側には送られず、よってブラウザにはPHPのソースコードは表示されません。さらに、JavaScriptにも変換'''されてない'''事に注目してください。
 
ブラウザで表示されているソースコードは、素のhtmlタグに変換されたあとのhtmlソースコードです。
 
なので、パスワードのような機密情報を、冒頭のようなPHPのコードだけでも守ることができます。
 
=== 実務との違い ===
ただし、実際の応用の際には、より慎重を期して、パスワードなどの機密情報のあるファイルは、ドキュメントルートよりも上側のフォルダに置くなどします。
 
そして、そのパスワードのファイルとの送受信をすることで、パスワードの成否の判定をします。
 
 
しかし本書では説明の単純化のため、冒頭のPHPコード例では、PHPコード内にパスワードの答えを含めました。
 
 
なお、一般にwebサイトにログインした場合には、ブラウザに「クッキー」といわれるログイン情報などを残す必要があります。これは <code>setcookie()</code>というPHPの組み込み関数、およびPHPのスーパーグローバル変数 $_COOKIE で可能です。
 
また、ブラウザにクッキー変数が存在しているかどうかは、isset()というPHP関数で調べられます。
 
 
 
その他、実務と手本のコードの相違点として、一般の会員制サイトでは、入力ボックスに何も入力されていない段階では、「ログイン」ボタンなどを押せないようになっていますが、その機能の実装はJavaScriptで出来ます。JavaScriptのif文や、onKeyUpプロパティなどを使えば、ボタンを押せない機能を実装できます。(詳しくはwikibooks『[[JavaScript/イベント処理]]』を参照してください。)
 
 
==== どこがダーティーか? ====
さらにMySQLなどのデータベース・ソフトウェアを使うことで、ユーザー名やらパスワード名などの会員情報は、MySQLなどに保管します。実務では、あまり、PHPのコード内やテキストファイルなどで直接にパスワードなどを保管することは無いです。
このコードには以下のような欠点があり、アジャイルにはともかく実務には使えません。
# スクリプトに認証情報がハードコードされている
#* サーバーに侵入されなければ、JavaScript のように丸見えにはなりませんが「サーバーに侵入されない」前提で認証関係のコードを書いてはいけません。
# メソッドを拠り所にフォームと認証を切り替えている
#* 細工したユーザーエージェントからならば、メソッドを自由に切替えてチャレンジできます。
# チャレンジ回数に限界がない
#* ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
 
== クッキーの入れ方 ==