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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎switch: PHPには、C風のswitchがあり、フォールスルーの挙動などほとんど同じですが、case の式に定数式以外の式が使える他、文字列などの比較も「緩やかな比較」で行えます。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
203 行
</syntaxhighlight>
 
== 条件分岐以外の話題 ==
=== シンプルでダーティーなログインフォーム ===
;login.php:<syntaxhighlight lang="php" line>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>シンプルでダーティーなログインフォーム</title>
</head>
<body>
<?php ?>
<?php if (!array_key_exists('username', $_POST)): ?>
<!-- GET Method -->
<form action="login.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>
<?php elseif ($_POST['username'] == "UserID" && $_POST['password'] == "PassWord" ): ?>
<!-- POST Method -->
<p>ログイン成功</p>
<?php else: ?>
<!-- POST Method -->
<p>ユーザー名 または パスワード が違います。<p>
<?php endif; ?>
</body>
</html>
</syntaxhighlight>
: このスクリプトは、ファーム入力とフォームの両方が含まれており
:;分岐コード:<syntaxhighlight lang="php" line highlight=999>
<?php if (!array_key_exists('username', $_POST)): ?>
</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>
<!-- POST Method -->
<p>ログイン成功</p>
</syntaxhighlight>
::を生成します。
::片方でも一致しなければ
::<syntaxhighlight lang=text>
<!-- POST Method -->
<p>ユーザー名 または パスワード が違います。<p>
</syntaxhighlight>
::を生成します。
:::(ここでどちらが不一致だったかを教えてはいけません。ブルートフォース攻撃が格段に易しくなります。)
 
; ファームのレンダリング例
<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="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="border: 2px solid #333;;border-radius:4px;padding:1px 8px">登録</span></div>
 
 
 
==== どこがダーティーか? ====
このコードには以下のような欠点があり、アジャイルにはともかく実務には使えません。
; スクリプトに認証情報がハードコードされている
: サーバーに侵入されなければ、JavaScript のように丸見えにはなりませんが「サーバーに侵入されない」前提で認証関係のコードを書いてはいけません。
; メソッドを拠り所にフォームと認証を切り替えている
: 細工したユーザーエージェントからならば、メソッドを自由に切替えてチャレンジできます。
; チャレンジ回数に限界がない
: ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
 
=== セッション管理 ===
PHPは、基本機能としてセッション管理機能を提供しています(認証機能ではありません)。
;session_example.php:<syntaxhighlight lang=php>
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head><title>PHP TEST</title></head>
<body>
<?php if (!isset($_COOKIE["PHPSESSID"])): ?>
<p>初回訪問: セッションを開始しました。</p>
<?php else: ?>
<p>すでにセッションは始まっています。<p>
<p>セッションIDは、<?= $_COOKIE["PHPSESSID"]; ?> です。<p>
<?php endif; ?>
</body>
</html>
</syntaxhighlight>
 
== 2つの比較演算子 ==
740 ⟶ 649行目:
</pre>
 
== 条件分岐以外の話題 ==
== 参考文献 ==
=== シンプルでダーティーなログインフォーム ===
;login.php:<syntaxhighlight lang="php" line>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>シンプルでダーティーなログインフォーム</title>
</head>
<body>
<?php ?>
<?php if (!array_key_exists('username', $_POST)): ?>
<!-- GET Method -->
<form action="login.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>
<?php elseif ($_POST['username'] == "UserID" && $_POST['password'] == "PassWord" ): ?>
<!-- POST Method -->
<p>ログイン成功</p>
<?php else: ?>
<!-- POST Method -->
<p>ユーザー名 または パスワード が違います。<p>
<?php endif; ?>
</body>
</html>
</syntaxhighlight>
: このスクリプトは、ファーム入力とフォームの両方が含まれており
:;分岐コード:<syntaxhighlight lang="php" line highlight=999>
<?php if (!array_key_exists('username', $_POST)): ?>
</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>
<!-- POST Method -->
<p>ログイン成功</p>
</syntaxhighlight>
::を生成します。
::片方でも一致しなければ
::<syntaxhighlight lang=text>
<!-- POST Method -->
<p>ユーザー名 または パスワード が違います。<p>
</syntaxhighlight>
::を生成します。
:::(ここでどちらが不一致だったかを教えてはいけません。ブルートフォース攻撃が格段に易しくなります。)
 
; ファームのレンダリング例
<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="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="border: 2px solid #333;;border-radius:4px;padding:1px 8px">登録</span></div>
 
 
 
==== どこがダーティーか? ====
このコードには以下のような欠点があり、アジャイルにはともかく実務には使えません。
; スクリプトに認証情報がハードコードされている
: サーバーに侵入されなければ、JavaScript のように丸見えにはなりませんが「サーバーに侵入されない」前提で認証関係のコードを書いてはいけません。
; メソッドを拠り所にフォームと認証を切り替えている
: 細工したユーザーエージェントからならば、メソッドを自由に切替えてチャレンジできます。
; チャレンジ回数に限界がない
: ブルートフォース攻撃に遭った時に、回数制限がないのは致命的な欠点です。
 
=== セッション管理 ===
PHPは、基本機能としてセッション管理機能を提供しています(認証機能ではありません)。
;session_example.php:<syntaxhighlight lang=php>
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head><title>PHP TEST</title></head>
<body>
<?php if (!isset($_COOKIE["PHPSESSID"])): ?>
<p>初回訪問: セッションを開始しました。</p>
<?php else: ?>
<p>すでにセッションは始まっています。<p>
<p>セッションIDは、<?= $_COOKIE["PHPSESSID"]; ?> です。<p>
<?php endif; ?>
</body>
</html>
</syntaxhighlight>
 
[[カテゴリ:PHP]]