teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

sy

2019/02/28 07:07

投稿

Roo
Roo

スコア55

title CHANGED
@@ -1,1 +1,1 @@
1
- バリデーションについて
1
+ sバリデーションについて
body CHANGED
@@ -222,6 +222,6 @@
222
222
 
223
223
 
224
224
  ###質問点
225
- 上記の形式だと.エラー文言を test_2.php で表示する仕様になっていますが、
225
+ 上記の形式だと.エラー文言を registration_mail_check.php で表示する仕様になっていますが、
226
- エラーが出た際に、test_1.phpにエラー文言を表示させたいです。
226
+ エラーが出た際に、registration_mail_form.php にエラー文言を表示させたいです。
227
227
  上記のどこのコードをどう修正すれば宜しいでしょうか?

2

修正

2019/02/28 07:07

投稿

Roo
Roo

スコア55

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
  phpで仮会員登録機能実装中
3
3
 
4
4
 
5
- 仮会員登録機能(POST)のみ:(test_1.php)
5
+ 仮会員登録機能(POST)のみ:(registration_mail_form.php)
6
6
  ```php
7
7
  <?php
8
8
  session_start();
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- ↓POSTされたトークン&メアド確認:(test_2.php)
59
+ ↓POSTされたトークン&メアド確認:(registration_mail_check.php)
60
60
  ```php
61
61
  <?php
62
62
  session_start();

1

修正

2019/02/28 06:54

投稿

Roo
Roo

スコア55

title CHANGED
File without changes
body CHANGED
@@ -1,32 +1,21 @@
1
1
  ###前提
2
2
  phpで仮会員登録機能実装中
3
- ↓仮会員登録機能
4
3
 
4
+
5
+ 仮会員登録機能(POST)のみ:(test_1.php)
5
6
  ```php
6
7
  <?php
7
8
  session_start();
8
9
 
9
10
  header("Content-type: text/html; charset=utf-8");
10
-
11
11
 
12
+ //クロスサイトリクエストフォージェリ(CSRF)対策
13
+ $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
12
- $errorMessage = "";
14
+ $token = $_SESSION['token'];
13
-
14
15
 
16
+ //クリックジャッキング対策
17
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
15
18
 
16
- // ログインボタンが押された場合
17
- if (isset($_POST["pre"])) {
18
- // 1. バリデーション
19
- if (empty($_POST["mail"])){
20
- $errorMessage = "メールが入力されていません。";
21
- }else{
22
- if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST["mail"])){
23
- $errorMessage = "メールアドレスの形式が正しくありません。";
24
- }else{
25
-
26
- }
27
- }
28
-
29
-
30
19
  ?>
31
20
 
32
21
  <!DOCTYPE html>
@@ -45,29 +34,194 @@
45
34
 
46
35
 
47
36
  <form action="registration_mail_check.php" method="post">
37
+
48
38
  <p>メールアドレス 必須</p>
49
- <input type="text" id="mail" name="mail" size="50">
39
+ <input type="text" name="mail" size="50">
50
-
51
- <div><font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font></div>
52
40
 
41
+
53
42
  <p>メールアドレス (確認用) 必須</p>
54
43
  <input type="text" name="mail_2" size="50">
55
44
 
56
- echo("$errorMessage")
57
45
 
58
46
  <p><input type="hidden" name="token" value="<?=$token?>"></p>
59
- <input type="submit" id="pre" value="登録する" name="pre">
47
+ <input type="submit" value="登録する">
60
48
 
61
49
  </form>
50
+
51
+
62
52
  </body>
63
53
  </html>
64
54
  ```
65
55
 
66
- ###疑問点
67
56
 
68
- <form action="registration_mail_check.php" method="post">
69
- こちら記載する場合、バリデーションがかからず処理が走り
70
- なしだとバリデーションが掛かります。
71
57
 
58
+
59
+ ↓POSTされたトークン&メアド確認:(test_2.php)
60
+ ```php
61
+ <?php
62
+ session_start();
63
+
64
+ header("Content-type: text/html;unix_socket=/tmp/mysql.sock;charset=utf-8");
65
+
66
+ //クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定
67
+ if ($_POST['token'] != $_SESSION['token']){
68
+ echo "不正アクセスの可能性あり";
69
+ exit();
70
+ }
71
+
72
+ //クリックジャッキング対策
73
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
74
+
75
+ //データベース接続
76
+ require_once("db.php");
77
+ $dbh = db_connect();
78
+
79
+
80
+ //エラーメッセージの初期化
81
+ $errors = array();
82
+
83
+ if(empty($_POST)) {
84
+ header("Location: registration_mail_form.php");
85
+ exit();
86
+ }else{
87
+ //POSTされたデータを変数に入れる
88
+ $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL;
89
+
90
+ //メール入力判定
91
+ if ($mail == ''){
92
+ $errors['mail'] = "メールが入力されていません。";
93
+ }else{
94
+ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){
95
+ $errors['mail_check'] = "メールアドレスの形式が正しくありません。";
96
+ }
97
+ require_once("db.php");
98
+ $dbh = db_connect();
99
+
100
+ function emailExists($email, $dbh){
101
+ $sql = "select * from pre_member where email = :email limit 1";
102
+ $stmt = $dbh->prepare($sql);
103
+ $stmt->execute(array(":email" => $email));
104
+ $user = $stmt->fetch();
105
+ return $user ? true : false;
106
+ }
107
+ }
108
+ }
109
+
110
+ if (count($errors) === 0){
111
+
112
+ $urltoken = hash('sha256',uniqid(rand(),1));
113
+ $url = "http://www1002uj.sakura.ne.jp/registration/registration_form.php"."?urltoken=".$urltoken;
114
+
115
+ //ここでデータベースに登録する
116
+ try{
117
+ //例外処理を投げる(スロー)ようにする
118
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
119
+
120
+ $statement = $dbh->prepare("INSERT INTO pre_member (urltoken,mail,date) VALUES (:urltoken,:mail,now() )");
121
+
122
+ //プレースホルダへ実際の値を設定する
123
+ $statement->bindValue(':urltoken', $urltoken, PDO::PARAM_STR);
124
+ $statement->bindValue(':mail', $mail, PDO::PARAM_STR);
125
+ $statement->execute();
126
+
127
+ //データベース接続切断
128
+ // $dbh = null;
129
+
130
+ }catch (PDOException $e){
131
+ $e->getMessage();
132
+ echo $e->getMessage();
133
+ $e->getLine();
134
+ echo $e->getLine();
135
+ // print('Error:'.$e->getMessage());
136
+ // die();
137
+ }
138
+
139
+ //メールの宛先
140
+ $mailTo = $mail;
141
+
142
+ //Return-Pathに指定するメールアドレス
143
+ $returnMail = 'web@sample.com';
144
+
145
+ $name = "仮会員登録機能【DB課題】";
146
+ $mail = '';
147
+ $subject = "仮会員登録ありがとうございます";
148
+
149
+ $body = <<< EOM
150
+ 仮会員登録完了
151
+ 下記のURLから新規会員登録に移動して下さい。
152
+ {$url}
153
+
154
+ ※このメールは送信専用メールアドレスから配信されています。
155
+ ご返信いただいてもお答えできませんのでご了承下さい。
156
+ URLの期限は24時間となっております。
157
+ EOM;
158
+
159
+ mb_language('ja');
160
+ mb_internal_encoding('UTF-8');
161
+
162
+ //Fromヘッダーを作成
163
+ $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>';
164
+
165
+ if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) {
166
+
167
+ //セッション変数を全て解除
168
+ $_SESSION = array();
169
+
170
+ //クッキーの削除
171
+ if (isset($_COOKIE["PHPSESSID"])) {
172
+ setcookie("PHPSESSID", '', time() - 1800, '/');
173
+ }
174
+
175
+ //セッションを破棄する
176
+ session_destroy();
177
+
178
+ $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。";
179
+
180
+ } else {
181
+ $errors['mail_error'] = "メールの送信に失敗しました。";
182
+ }
183
+ }
184
+
185
+ ?>
186
+
187
+ <!DOCTYPE html>
188
+ <html>
189
+ <head>
190
+ <title>メール確認画面</title>
191
+ <meta charset="utf-8">
192
+ </head>
193
+ <body>
194
+ <h1>メール確認画面</h1>
195
+
196
+ <?php if (count($errors) === 0): ?>
197
+
198
+ <p><?=$message?></p>
199
+
200
+ <p>↓このURLが記載されたメールが届きます。</p>
201
+ <a href="<?=$url?>"><?=$url?></a>
202
+
203
+ <?php elseif(count($errors) > 0): ?>
204
+
205
+ <?php
206
+ foreach($errors as $value){
207
+ echo "<p>".$value."</p>";
208
+ }
209
+ ?>
210
+
211
+ <input type="button" value="戻る" onClick="history.back()">
212
+
213
+ <?php endif; ?>
214
+
215
+ </body>
216
+ </html>
217
+ ```
218
+
219
+ +DB接続のファイル
220
+ の上記三つのファイル構成で仮会員登録を行っています。
221
+
222
+
223
+
72
224
  ###質問点
225
+ 上記の形式だと.エラー文言を test_2.php で表示する仕様になっていますが、
226
+ エラーが出た際に、test_1.phpにエラー文言を表示させたいです。
73
227
  上記のどこのコードをどう修正すれば宜しいでしょうか?