2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フォーム入力欄と入力確認画面にホームページと性別と年齢及びお問い合わせ内容、Cautionの追加をする

Last updated at Posted at 2024-03-24

フォーム入力画面($pageFlag = 0) にホームページとホームページ(URL)と性別と年齢及びお問い合わせ内容、Cautionの追加

type属性:

  • ホームページ = url
  • 性別 = radio
  • 年齢 = select , option
  • お問い合わせ内容 = textarea
  • caution = checkbox
form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか? -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
        送信が完了しました。
        <!-- sessionトークンの削除 -->
        <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <input type="radio" name="gender" value="0">男性
            <input type="radio" name="gender" value="1">女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1">〜19歳</option>
                <option value="2">20歳〜29歳</option>
                <option value="3">30歳〜39歳</option>
                <option value="4">40歳〜49歳</option>
                <option value="5">50歳〜59歳</option>
                <option value="6">60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>

入力画面でデータを入力してブラウザで下記にようにデータが入っていればOK

browser
array(9) {
  ["name"]=>
  string(3) "abc"
  ["email"]=>
  string(13) "test@test.com"
  ["url"]=>
  string(18) "https://google.com"
  ["gender"]=>
  string(1) "0"
  ["age"]=>
  string(1) "5"
  ["contact"]=>
  string(20) "あああ
いいい"
  ["caution"]=>
  string(1) "1"
  ["btn_confirm"]=>
  string(12) "確認する"
  ["csrf"]=>
  string(64) "0558ab1a3f4b7c49801014f3bbe4269c11923a6e8e7c6f1a5b841e02bc330c07"
}
氏名 abc
メールアドレス test@test.com

確認画面($pageFlag = 1) にホームページとホームページ(URL)と性別と年齢及びお問い合わせ内容、Cautionの追加

form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか? -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="url" value="<?php echo h($_POST['url']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
            送信が完了しました。
            <!-- sessionトークンの削除 -->
            <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <input type="radio" name="gender" value="0">男性
            <input type="radio" name="gender" value="1">女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1">〜19歳</option>
                <option value="2">20歳〜29歳</option>
                <option value="3">30歳〜39歳</option>
                <option value="4">40歳〜49歳</option>
                <option value="5">50歳〜59歳</option>
                <option value="6">60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>

テキストエリアで入力されたテキストが改行されて表示されるようにするには
nl2br関数を使用する。

<?php echo nl2br(h($_POST['contact'])); ?>

確認ページに遷移時には下記の結果になれば良い。

スクリーンショット 2024-03-24 16.55.40.png

戻るボタンを押下時の入力フォーム($pageFlag === 0)への情報表示 (URL, 性別, 年齢, お問い合わせ内容)

form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか? -->
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="url" value="<?php echo h($_POST['url']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
        <?php endif; ?>
    <?php endif; ?>

    <!-- 確認画面から送信後に遷移する完了画面の作成 -->
    <?php if ($pageFlag === 2) : ?>
        送信が完了しました。
        <!-- sessionトークンの削除 -->
        <?php unset($_SESSION['csrfToken']);  ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <!-- !emptyをしようすると0でもtrueになってしまう為にissetを使用する -->
            <input type="radio" name="gender" value="0" <?php if (isset($_POST['gender']) && $_POST['gender'] === '0') {
                                                            echo 'checked';
                                                        } ?>>男性
            <input type="radio" name="gender" value="1" <?php if (isset($_POST['gender']) && $_POST['gender'] === '1') {
                                                            echo 'checked';
                                                        } ?>>女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1" <?php if (isset($_POST['age']) && $_POST['age'] === '1') {
                                        echo 'selected';
                                    } ?>>〜19歳</option>
                <option value="2" <?php if (isset($_POST['age']) && $_POST['age'] === '2') {
                                        echo 'selected';
                                    } ?>>20歳〜29歳</option>
                <option value="3" <?php if (isset($_POST['age']) && $_POST['age'] === '3') {
                                        echo 'selected';
                                    } ?>>30歳〜39歳</option>
                <option value="4" <?php if (isset($_POST['age']) && $_POST['age'] === '4') {
                                        echo 'selected';
                                    } ?>>40歳〜49歳</option>
                <option value="5" <?php if (isset($_POST['age']) && $_POST['age'] === '5') {
                                        echo 'selected';
                                    } ?>>50歳〜59歳</option>
                <option value="6" <?php if (isset($_POST['age']) && $_POST['age'] === '6') {
                                        echo 'selected';
                                    } ?>>60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"><?php if (!empty($_POST['contact'])) {
                                            echo h($_POST['contact']);
                                        } ?></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>
  1. 「性別」と「年齢」の値について:
    性別と年齢の値は文字列で表現されています。つまり、男性は '0' 、女性は '1' という文字列で表されています。このため、値を比較する際には文字列として比較する必要があります。

  2. isset の使用について:
    性別と年齢のデータが送信されていない場合には、それぞれの変数はセットされていません。
    しかし、 $_POST['gender']$_POST['age'] が存在する場合でも、値が '0' や '1' という可能性があるため、!empty を使用すると条件が満たされてしまいます。
    そのため、実際に値がセットされているかどうかを確認するために isset を使用しています。

戻る ボタン押下後、下記のように表示されれば良い。

スクリーンショット 2024-03-25 11.08.07.png

以上です。
ご指摘があればお願いします!

CSRF対策のご指摘を受け自分なりに修正してみる

form.php
<?php

// sessionを使えるようにする
session_start();

// クリックジャッキング対策
header('X-FRAME-OPTIONS:DENY');

// トークンが発行されているかの確認
if (!empty($_POST)) {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
}

$pageFlag = 0; // 入力画面のフラグ(Topのフォーム画面)

// $_POST['btn_confirm']が空でなければ $psteFlag = 1 に切り替える
if (!empty($_POST['btn_confirm'])) {
    $pageFlag = 1;
}

// $_POST['btn_submit']が空でなければ $psteFlag = 2 に切り替える
if (!empty($_POST['btn_submit'])) {
    $pageFlag = 2;
}

// サニタイズ htmlspecialchars関数
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- フォームに入力された確認画面の作成 -->
    <?php if ($pageFlag === 1) : ?>
        <!-- 発行されたトークンと送信されてきたトークンが一致するかどうか? -->
        <?php if (isset($_SESSION['csrfToken']) && $_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            <form method="POST" action="form.php">
                氏名
                <?php echo h($_POST['name']); ?> <!-- サニタイズ -->
                <br>
                メールアドレス
                <?php echo h($_POST['email']); ?> <!-- サニタイズ -->
                <br>
                ホームページ
                <?php echo h($_POST['url']); ?> <!-- サニタイズ -->
                <br>
                性別
                <?php
                echo $_POST['gender'] === '0' ? '男性' : '女性';
                ?>
                <br>
                年齢
                <?php
                if ($_POST['age'] === '1') {
                    echo '〜19歳';
                }
                if ($_POST['age'] === '2') {
                    echo '20歳〜29歳';
                }
                if ($_POST['age'] === '3') {
                    echo '30歳〜39歳';
                }
                if ($_POST['age'] === '4') {
                    echo '40歳〜49歳';
                }
                if ($_POST['age'] === '5') {
                    echo '50歳〜59歳';
                }
                if ($_POST['age'] === '6') {
                    echo '60歳〜';
                }
                ?>
                <br>
                お問い合わせ内容
                <br>
                <?php echo nl2br(h($_POST['contact'])); ?> <!-- サニタイズ -->
                <br>
                <!-- name属性の 'back' は $pageFlagの定義がないので 初期設定の '$pageFlag = 0;' になる -->
                <input type="submit" name="back" value="戻る">
                <!-- 完了ページへデータを送信する為のボタン($pageFlag = 2) -->
                <input type="submit" name="btn_submit" value="送信する">
                <!-- 各入力データの保持 hiddenの使用 -->
                <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="gender" value="<?php echo h($_POST['gender']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="age" value="<?php echo h($_POST['age']); ?>"> <!-- サニタイズ -->
                <input type="hidden" name="contact" value="<?php echo h($_POST['contact']); ?>"> <!-- サニタイズ -->
                <!-- トークンの保持 -->
                <input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']); ?>"> <!-- サニタイズ -->
            </form>
            <?php else : ?>
                <p>不正なアクセスです。</p>
        <?php endif; ?>
    <?php endif; ?>

    <?php if ($pageFlag === 2) : ?>
        <?php if ($_POST['csrf'] === $_SESSION['csrfToken']) : ?>
            送信が完了しました。
            <!-- sessionトークンの削除 -->
            <?php unset($_SESSION['csrfToken']);  ?>
            <?php else : ?>
                <p>不正なアクセスです。</p>
                <?php unset($_SESSION['csrfToken']);  ?>
        <?php endif; ?>
    <?php endif; ?>

    <!-- トークンが発行されていないときはトークンを発行する -->
    <?php if ($pageFlag === 0) : ?>
        <?php if (!isset($_SESSION['csrfToken'])) {
            $csrfToken = bin2hex(random_bytes(32));
            $_SESSION['csrfToken'] = $csrfToken;
        }
        $token = $_SESSION['csrfToken'];
        ?>
        <!-- フォーム入力画面を作成する(TOP) -->
        <form method="POST" action="form.php">
            氏名
            <!-- もし $_POST['name']が空でなければ、入力データを表示 -->
            <input type="text" name="name" value="<?php if (!empty($_POST['name'])) {
                                                        echo h($_POST['name']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            メールアドレス
            <!-- もし $_POST['email']が空でなければ、入力データを表示 -->
            <input type="email" name="email" value="<?php if (!empty($_POST['email'])) {
                                                        echo h($_POST['email']);
                                                    } ?>"> <!-- サニタイズ -->
            <br>
            ホームページ
            <input type="url" name="url" value="<?php if (!empty($_POST['url'])) {
                                                    echo h($_POST['url']);
                                                } ?>">
            <br>
            性別
            <!-- !emptyをしようすると0でもtrueになってしまう為にissetを使用する -->
            <input type="radio" name="gender" value="0" <?php if (isset($_POST['gender']) && $_POST['gender'] === '0') {
                                                            echo 'checked';
                                                        } ?>>男性
            <input type="radio" name="gender" value="1" <?php if (isset($_POST['gender']) && $_POST['gender'] === '1') {
                                                            echo 'checked';
                                                        } ?>>女性
            <br>
            年齢
            <select name="age">
                <option value="">選択してください</option>
                <option value="1" <?php if (isset($_POST['age']) && $_POST['age'] === '1') {
                                        echo 'selected';
                                    } ?>>〜19歳</option>
                <option value="2" <?php if (isset($_POST['age']) && $_POST['age'] === '2') {
                                        echo 'selected';
                                    } ?>>20歳〜29歳</option>
                <option value="3" <?php if (isset($_POST['age']) && $_POST['age'] === '3') {
                                        echo 'selected';
                                    } ?>>30歳〜39歳</option>
                <option value="4" <?php if (isset($_POST['age']) && $_POST['age'] === '4') {
                                        echo 'selected';
                                    } ?>>40歳〜49歳</option>
                <option value="5" <?php if (isset($_POST['age']) && $_POST['age'] === '5') {
                                        echo 'selected';
                                    } ?>>50歳〜59歳</option>
                <option value="6" <?php if (isset($_POST['age']) && $_POST['age'] === '6') {
                                        echo 'selected';
                                    } ?>>60歳〜</option>
            </select>
            <br>
            お問い合わせ内容
            <textarea name="contact"><?php if (!empty($_POST['contact'])) {
                                            echo h($_POST['contact']);
                                        } ?></textarea>
            <br>
            <input type="checkbox" name="caution" value="1">注意事項にチェックする
            <br>
            <!-- btn_confirm(確認ページ)に入力データが送信されるようにする -->
            <input type="submit" name="btn_confirm" value="確認する">
            <!-- トークンを保持 -->
            <input type="hidden" name="csrf" value="<?php echo h($token) ?>">
        </form>
    <?php endif; ?>
</body>

</html>

※ PHP フォームセキュリティの学習振り返り FWなしの投稿で説明はさせてもらってます。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?