Webデザイナーへの道しるべ | suge1040's diary

Webデザイナーになる事を目指しフェリカテクニカルアカデミーで勉強していましたsuge1040によるブログです。

6/5授業メモ PHP

IDの盗難を防ぐ

init.phpのsession_start( ); が動いたら cookie が動く。

 

- index.php -

<?php

require_once dirname(__FILE__).'./init.php';

 

$name = '';

$email = '';

$message = '';

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

 $name = $_SESSION['mail_data']['name'];

 $email = $_SESSION['mail_data']['email'];

 $message = $_SESSION['mail_data']['message'];

}

?>

 

<!DOCTYPE html>

<html lang="ja">

<head>

<meta charset="UTF-8">

<title>お問い合わせ入力フォーム</title>

<link rel="stylesheet" href="css/style.css">

</head>

<body>

<div id="container">

<h1>お問い合わせ入力フォーム</h1>

<form action="check.php" method="post" id="mailform">

<table>

<tr>

<th><label for="name">お名前:<br><span>※必須</span>&nbsp;&nbsp;30文字以内</label></th>

<td><input type="text" name="name" id="name" size="30" placeholder="例:東京太郎"

value="<?php echo h($name); ?>"></td>

</tr>

<tr>

<th><label for="email">email:<br><span>※必須</span>&nbsp;&nbsp;50文字以内</label></th>

<td><input type="text" name="email" id="email" size="50" placeholder="例:sample@sample.com" value="<?php echo h($email); ?>"></td>

</tr>

<tr>

<th><label for="message">お問い合わせ:<br><span>※必須</span>&nbsp;&nbsp;128文字以内</label></th>

<td><textarea name="message" id="message" cols="30" rows="5" placeholder="例:御社商品の資料請求を致します。" ><?php echo h($message); ?></textarea></td>

</tr>

</table>

<input type="submit" value="確認">

</form>

</div>

</body>

</html>

 

<?php

ob_end_flush();

 

- check.php -

<?php
require_once dirname(__FILE__).'./init.php';

//POSTデータが渡ってきているかチェックする
  //渡ってきてなかったら、先頭ページへ返す
if(empty($_POST)){
  header('Location:index.php');
  exit;
}

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$error = true;


$name_error = '';
$email_error = '';
$message_error = '';




//名前の入力画数の最大入力画数を決める
if(mb_strlen($name, 'UTF-8')>30){
  $name_error = 'お名前が長すぎます。';
  $error = false;
}

//メールアドレスの最大入力画数を決める
if(mb_strlen($email, 'UTF-8')>50){
  $email_error = 'メールアドレスが長すぎます。';
  $error = false;
}



//メッセージの最大入力画数を決める
if(mb_strlen($message, 'UTF-8')>128){
  $message_error = 'お問い合わせ内容が長すぎます。';
  $error = false;
}

//@マークのチェック
if(strpos($email, '@') === false){
  $email_error = '不正なメールアドレスです。';
  $error = false;
}

//半角チェック
if(strlen($email) !== mb_strlen($email, "utf-8")){
  $email_error = '半角数字で入力してください。';
  $error = false;
}

//空文字チェック
if($name==''){
  $name_error = 'お名前が、入力されていません。';
  $error = false;
}
if($email==''){
  $email_error = 'メールアドレスが、入力されていません。';
  $error = false;
}
if($message==''){
  $message_error = 'お問い合わせ内容が、入力されていません。';
  $error = false;
}

$_SESSION=array();
$_SESSION['mail_data'] ['name'] = $name;
$_SESSION['mail_data'] ['email'] = $email;
$_SESSION['mail_data'] ['message'] = $message;
$_SESSION['mail_date'] ['error'] = $error;

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>お問い合わせ確認画面</title>
<link rel="stylesheet" href="css/style1.css">
</head>
<body>
<div id="container">
<h1>お問い合わせ確認</h1>
<table>
<tr>
<th>お名前:</th><td><?php echo h($name) . h($name_error); ?></td>
</tr>
<tr>
<th>email:</th><td><?php echo h($email) . h($email_error); ?></td>
</tr>
<tr>
<th>お問い合わせ内容:</th><td><?php echo nl2br(h($message) . h($message_error)); ?></td>
</tr>
</table>
<p><a href="index.php">戻る</a>
<?php
if($error){
  echo '<a href="thanks.php">送信</a>';
}
?>
</p>
</div>
</body>
</html>
<?php
ob_end_flush();

 

- thanks.php -

<?php
require_once dirname(__FILE__).'./init.php';

if(!$_SESSION['mail_date'] ['error']){
  header('Location:index.php');
  exit;
}

//セッションから値を取得
$name = $_SESSION['mail_data']['name'];
$email = $_SESSION['mail_data']['email'];
$message = $_SESSION['mail_data']['message'];

//セッションを取っておく必要がないのでクリア
$_SESSION['mail_data'] =array();
unset($_SESSION['mail_data']);

if( isset( $_COOKIE[ session_name() ] )) {
  setcookie( session_name(), '', time()-42000, '/');
}



//クライアントへのメール送信内容の設定
$to = 'xxxxxxxxxx@gmail.com';
$subject = 'お問い合わせメール';
$body =<<<BODY
 【お問い合わせメール】
以下の内容で承りました。
お名前:
{$name}
メールアドレス:
{$email}
メッセージ:
{$message}
BODY;

//メールのコーディング設定
mb_language('japanese');
mb_internal_encoding("UTF-8");

$r = mb_send_mail( $to , $subject , $body );

$thanks_message ='上記の内容でお問い合わせメールを承りました。';

if(!$r) {
 $thanks_message ='メール送信エラー。以下お問い合わせは送信されませんでした。';
}


?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>送信完了</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="container">
<h1>送信完了</h1>
<table>
<tr>
<th>お名前:</th>
<td><?php echo h($name); ?></td>
</tr>
<tr>
<th>email:</th>
<td><?php echo h($email); ?></td>
</tr>
<tr>
<th>お問い合わせ内容:</th>
<td><?php echo nl2br(h($message)); ?></td>
</tr>
</table>
<p>
<?php
if(!$r){
  echo '<span>' . h($thanks_message) . '</span>';
} else {
  echo h($thanks_message);
}
?>
</p>
<p><a href="index.php">戻る</a></p>
</div>
</body>
</html>
<?php
ob_end_flush();

 

 

- init.php -

<?php

function h($str){

 return htmlspecialchars($str,ENT_QUOTES,"UTF-8");

}

header('X-Frame-OPTIONS:DENY');

ob_start();

session_start();

session_regenerate_id(true);

 

①init.php の session_start( ); の下に session_regenerate_id(true); を記述する。

session_regenerate_id(true); は、cookie のIDを新しく更新される。

 

②thanks.php に記述

$_SESSION['mail_data'] =array();

unset($_SESSION['mail_data']);

の下に下記を記述

if( isset( $_COOKIE[ session_name() ] )) {

 setcookie( session_name(), '', time()-42000, '/');

}

''はシングルコーテーションを2個です。

※$_COOKIEは、グローバル変数サーバーに保存されている。

※time( )-42000は、今から-42000がすでに有効期限が切れているよ!と言っている。

 

③session_destroy()

※サーバー側にも削減を命令

 

④check.php

if(strlen($tel) !== mb_strlen($tel, "utf-8")){

 $tel_error = '半角数字で入力してください。';

 $error = false;

} else {

 if(strlen($tel)>13){

    $tel_error = 'お電話番号が長すぎます。';

    $error = false;

 }

}

 

赤字を削除。

 

if(strlen($tel) !== mb_strlen($tel, "utf-8")){

 $tel_error = '半角数字で入力してください。';

 $error = false;

}

if(strlen($tel)>13){

 $tel_error = 'お電話番号が長すぎます。';

 $error = false;

}

 

⑤空文字チェック、半角、文字列の長さ

 

if($name==''){

 $name_error = 'お名前が、入力されていません。';

 $error = false;

}

if($email==''){

 $email_error = 'メールアドレスが、入力されていません。';

 $error = false;

}

if($tel==''){

 $tel_error = 'お電話番号が、入力されていません。';

 $error = false;

}

if($message==''){

 $message_error = 'お問い合わせ内容が、入力されていません。';

 $error = false;

}

 

 

$name_error = '';

$email_error = '';

$tel_error = '';

$message_error = '';

 

の下から

 

if(strlen($message)>128){

 $message_error = 'お問い合わせ内容が長すぎます。';

 $error = false;

}

 

の下に移動。

 

if(strlen($tel) !== mb_strlen($tel, "utf-8")){

 $tel_error = '半角数字で入力してください。';

 $error = false;

}

 

 

if(strpos($email, '@') === false){

 $email_error = '不正なメールアドレスです。';

 $error = false;

}

 

の下から

 

if(strlen($message)>128){

 $message_error = 'お問い合わせ内容が長すぎます。';

 $error = false;

}

 

の下へ移動する。

 

if(strlen($tel) !== mb_strlen($tel, "utf-8")){

 $tel_error = '半角数字で入力してください。';

 $error = false;

}

 

をコピーしてすぐ下にペーストして $tel を $email に書き換えて

 

if(strlen($email) !== mb_strlen($email, "utf-8")){

 $email_error = '半角数字で入力してください。';

 $error = false;

}

 

にする。

 

if(strpos($email, '@') === false){

 $email_error = '不正なメールアドレスです。';

 $error = false;

}

 

if(strlen($email)>50){

 $email_error = 'メールアドレスが長すぎます。';

 $error = false;

}

 

の下から

 

if(strlen($message)>128){

 $message_error = 'お問い合わせ内容が長すぎます。';

 $error = false;

}

 

の下に移動

 

⑩メールアドレスは、;を入れると複数入れられる。

 

⑪check.php に赤字( mb_  ,'UTF-8' )を追記する。

if(mb_strlen($name,'UTF-8')>30){

 $name_error = 'お名前が長すぎます。';

 $error = false;

}

 

if(mb_strlen($email, 'UTF-8')>50){

 $email_error = 'メールアドレスが長すぎます。';

 $error = false;

}

 

if(mb_strlen($tel, 'UTF-8')>13){

 $tel_error = 'お電話番号が長すぎます。';

 $error = false;

}

 

if(mb_strlen($message, 'UTF-8')>128){

 $message_error = 'お問い合わせ内容が長すぎます。';

 $error = false;

}

 

⑫電話番号の入力フォームを消す。