入力画面に戻る、クロスサイトリクエストフォージェリとは、完了画面作成(ワンタイムチケットの発行、チェック、破棄、リダイレクト処理)


入力画面に戻る

 form1.phpを以下のように編集する

<?php
session_start();

$errors = array();
if(isset($_POST['submit'])){
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$body = $_POST['body'];

 $name = htmlspecialchars($name,ENT_QUOTES);
 $email = htmlspecialchars($email,ENT_QUOTES);
 $subject = htmlspecialchars($subject,ENT_QUOTES);
 $body = htmlspecialchars($body,ENT_QUOTES);


    if($name ===""){
        $errors['name']="お名前が入力されていません。";
    }
    if($email ===""){
        $errors['email'] ="メールアドレスが入力されていません。";
    }
    if($body ===""){
        $errors['body']="お問い合わせ内容が入力されていません";
    }

    if(count($errors) === 0){

        $_SESSION['name'] = $name;
        $_SESSION['email'] = $email;
        $_SESSION['subject'] = $subject;
        $_SESSION['body'] = $body;
        header('Location:http://localhost/php_form/form2.php');
        exit();
    }

    if(isset($_GET['action']) && $_GET['action'] === 'edit'){

        $name = $_SESSION['name'];
        $email = $_SESSION['email'];
        $subject = $_SESSION['subject'];
        $body = $_SESSION['body'];
    }

}
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>お問い合わせ</title>
</head>
<body>
    <?php
    echo"<ul>";
    foreach($errors as $value){
        echo"<li>";
        echo $value;
        echo "</li>";
    }
    echo"</ul>";
    ?>
    <form action="form1.php" method="post">
    <table>
        <tr>
        <th>お名前</th><td><input type="text" name="name" value="<?php if(isset($name)){echo $name;}?>"></td>
        </tr>
        <tr>
        <th>メールアドレス</th><td><input type="text" name="email" value="<?php if(isset($email)){echo $email;}?>"></td>
        </tr>
        <tr>
            <th>お問い合わせの種類</th><td>
            <select name="subject">
                <option value="お仕事に関するお問い合わせ" <?php if(isset($subject) && $subject === "お仕事に関するお問い合わせ") { echo "selected";} ?>>お仕事に関するお問い合わせ</option>
                <option value="その他のお問い合わせ" <?php if(isset($subject) && $subject === "その他のお問い合わせ") {echo "selected";} ?>> その他のお問い合わせ</option>
            </select></td>
        </tr>
        <tr>
            <th>お問い合わせ内容</th>
            <td><textarea name="body" cols="40" rows="10"><?php if(isset($body)){echo $body;}?></textarea></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="submit" value="確認画面へ"></td>
        </tr>
    </table>
    </form>
</body>
</html>

form2.phpを以下のように編集する

<?php
session_start();

if(isset($_SESSION['name'])){

    $name = $_SESSION['name'];
    $email = $_SESSION['email'];
    $subject = $_SESSION['subject'];
    $body = $_SESSION['body'];
}
?>



<!doctype html>
<html>
<htad>
    <meta charset="utf-8">
    <title>確認画面 - お問い合わせ</title>
</htad>

<body>

    <form action="form3.php" method="post">
    <table>
        <tr>
            <th>お名前</th><td><?php echo $name; ?></td>
        </tr>
        <tr>
            <th>メールアドレス</th><td><?php echo $email; ?></td>
        </tr>
        <tr>
            <th>お問い合わせの種類</th><td><?php echo $subject; ?></td>
        </tr>
        <tr>
            <th>お問い合わせ内容</th><td><?php echo nl2br($body); ?></td>

        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="submit" value="送信する"></td>
        </tr>
        </table>
        </form>
        <p><a href="form1.php?action=edit">入力画面へ戻る</a></p>
    </body>
</html>

 <a href="form1.php?action=edit">はURLパラメータと呼ばれている
 URLの後ろにデータをくっつけて、HTTPのGETメソッドでデータを送ることができる。
 actionは変数名、editが変数の値で、どちらも任意の文字列です
 URLパラメータを使うと別なページにデータを渡すことができる
 URLパラメータの値は、$_GETというPHPが自動で生成する連想配列に自動で格納される。
 form2.phpで、form1.php?action=editと記載しているので$_GETには、actionというキーができ、値はeditが格納されている
 
Google Chromeを起動し「http://localhost/php_form/form1.php」にアクセスする
その後各項目に任意の文字を入力後確認ボタンへを押下

 

その後、入力画面へ戻るを押下し入力画面に戻ることができることを確認する。

クロスサイトリクエストフォージェリとは

 ユーがーがあるサイトでログインをした状態で、他のサイトを閲覧すると
 ユーザーが意図しない操作をユーザーの権限を利用して実行される
 ECサイトでは、ログインをしていても、商品を購入するときは、再度ユーザ名とパスワードを入れるさいとがほとんどです。
 これらはクロスサイトリクエストフォージェリ対策になっている。

完了画面作成

form2.phpを以下のように編集する

<?php
session_start();

if(isset($_SESSION['name'])){

    $name = $_SESSION['name'];
    $email = $_SESSION['email'];
    $subject = $_SESSION['subject'];
    $body = $_SESSION['body'];
}
$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(48));
$token = htmlspecialchars($_SESSION['token'],ENT_QUOTES);
?>



<!doctype html>
<html>
<htad>
    <meta charset="utf-8">
    <title>確認画面 - お問い合わせ</title>
</htad>

<body>

    <form action="form3.php" method="post">
        <input type="hidden"name="token"value="<?php echo $token ?>">
    <table>
        <tr>
            <th>お名前</th><td><?php echo $name; ?></td>
        </tr>
        <tr>
            <th>メールアドレス</th><td><?php echo $email; ?></td>
        </tr>
        <tr>
            <th>お問い合わせの種類</th><td><?php echo $subject; ?></td>
        </tr>
        <tr>
            <th>お問い合わせ内容</th><td><?php echo nl2br($body); ?></td>

        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="submit" value="送信する"></td>
        </tr>
        </table>
        </form>
        <p><a href="form1.php?action=edit">入力画面へ戻る</a></p>
    </body>
</html>

form3.phpを新規に作成

<?php
 session_start();

if(isset($_POST['token'],$_SESSION['token'])&& ($_POST['token'] === $_SESSION['token'])){
    unset($_SESSION['token']);
    echo "きちんとしたアクセスです";
}else{
    header('Location:http://localhost/php_form/form1.php');
    exit();
}
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>完了画面</title>
</head>
<body>
<p>お問い合わせありがとうございます。</p>
</body>
</html>

Google Chromeを起動し「http://localhost/php_form/form1.php」にアクセスする
その後各項目に任意の文字を入力後確認ボタンへを押下

その後送信するボタンを押下

以下のように表示されていることを確認する

また、そのまま更新ボタンを押下して入力画面に変更されていることを確認するこれでワンタイムチケットを破棄、またリダイレクト処理が実施されていることを確認

以上