PHP
HTML
MySQL

PHPでフォーム作成(仮)

(自分用)復習箇所メモ:XSSとSQLインジェクション


エラーを起こしていた原因と難しかったところを厳選した。


PDO接続


pdo.php

//PDO接続のテンプレート

try {
$pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

} catch (PDOException $e) {
echo $e->getMessage();
exit;
}



フォーム作成


index.php


SQLの連携と表示

username,password,don,dbnameをdefine()でやると、うまく動かなかった

そのため、必要なファイルにすべて変数を記述した

index.phpでないとダメなのか?


index.php


define('DSN','mysql:host=localhost;dbname=yamaguchi_db');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');


input.php


$_SESSION

session_start();を始めに記載しておく

valueに入れて表示させる


バリデーション(入力必須)required

必須項目はHTMLから設定できることを知らなかったため時間がかかった

これに関する調べ方が、PHPに限ったものだったので答えが出てこなかった


input.php


<input type="number" name="number" value="<?php
  if(isset($_SESSION['number']))
  echo htmlspecialchars($_SESSION['number'], ENT_QUOTES, utf-8);
  ?>" required>



confirm.php


$_POST

元のHTMLの属性をnameで設定していないことで、時間がかかった


間違いの原因は、idにしていたから


バリデーション(入力規定)


  • /^[0-9]+$/

    半角数字で連続する数字の列で入力可能

  • /^[a-zA-Z]+$/

    半角英字で連続する文字列を入力可能


リダイレクト

エラー項目がある場合、入力画面に戻す

その際にSESSIONを使って、正しく入力されていた情報を保持


  • どのようにしてリダイレクトするか

    errors()の配列を作って、下に書いてあるバリデーションのコードをifに入れた.

    その後に不適切であれば、$errors['number']とかで適当な変数をつける.

    count()を使ってerrorsの中身が0でないとき、リダイレクトで返す


XssとSQLインジェクション

入力内容をJavaScriptのコードやSQLの文などにすると、悪さをできる

そのために、対策をする


confirm.php


//バリデーション
!preg_match("/^[a-zA-Z]+$/", $yourName);

//リダイレクト
header('Location:input.php’);

//バリデーションとリダイレクト組み合わせ

$errors = array();

if(!preg_match("/^[0-9]+$/", $number)){
$errors['number2'] = "半角数字で入力してください";
}

if(count($errors) !== 0){
header('Location: input.php');
exit();
}

//XSS対策
htmlspecialchars($_SESSION[yourName]);



complete.php


SQLに挿入

SQLの文で、VALUESをVALUEにしていたからエラーになっていた


complete.php

//SQLインジェクション

$sql = "INSERT INTO form_table (number, name, age, note) VALUES (:number, :name, :age, :note)";
$stmt = $pdo->prepare($sql);
$params = array(':number' => $_SESSION['number'], ':name' => $_SESSION['name'], ':age' => $_SESSION['age'], ':note' => $_SESSION['note']);
$stmt->execute($params);