PHP

【PHP】Webフォーム基礎

kurumin

ソース

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Webフォーム</title>
</head>
<body>
  <h1>Webフォーム</h1>
  <form action="receive.php" method="post">
    名前:<input type="text" name="myname" required><br>
    年齢:<input type="number" name="age"><br>
    <input type="submit" value="送信">
  </form>
</body>
</html>

receive.php


<?php
  $myname = $_POST['myname'];
  $age = $_POST['age'];

  // セッションにデータを格納
  session_start();
  $_SESSION['myname'] = $myname;
  $_SESSION['age'] = $age;

  // Tokenを作成
  // 疑似乱数を生成
  $bytes = openssl_random_pseudo_bytes(16);
  // 16進数に変換
  $token = bin2hex($bytes);

  echo $token;
  // セッションにセット
  $_SESSION['token'] = $token;
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>データ確認</title>
</head>
<body>
  <h1>データ確認</h1>
  名前:<?php echo htmlspecialchars($myname, ENT_QUOTES, 'UTF-8'); ?><br>
  年齢:<?php echo htmlspecialchars($age, ENT_QUOTES, 'UTF-8'); ?>
  <form action="tnk.php" method="post">
    <input type="hidden" name="token" value="<?php echo $token; ?>">
    <input type="submit" value="送信">
  </form>
</body>
</html>

tnk.php

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ありがとうございました</title>
</head>
<body>
  <?php
    session_start();
  
    if($_POST['token'] != $_SESSION['token']) {
      print '<h1>ページ遷移が正しくありません</h1>';
    } else {
      print '<h1>ありがとうございました</h1>';
      print '名前:'.$_SESSION['myname'].'<br>';
      print '年齢:'.$_SESSION['age'];
    }

    // 明示。記述しなくても大丈夫だけど念のため。
    session_destroy();
  ?>
</body>
</html>

htmlspecialchars(エスケープ処理したいもの, ENT_QUOTES, ‘UTF-8’)

エスケープ処理をする。セキュリティ強化のために必ず行う。

$_SESSIONでセキュリティ強化

一次的にデータを保持する。

トークンでさらにセキュリティ強化

乱数を生成し、ページ遷移後にフォームで受け渡した値とセッションの値が合っているか確認する。

POSTとGETの違い

GET

データの取得に使用(パラメータをURLで渡す)

POST

データの送信、登録に使用(パラメータをHTTPリクエストのbody部で渡す)

ABOUT ME
記事URLをコピーしました