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

質問編集履歴

2

誤字訂正

2017/05/01 11:51

投稿

7968
7968

スコア253

title CHANGED
@@ -1,1 +1,1 @@
1
- mb_convert_encoding で文字エンコーディングを変換したときに、メーラー側ではその一部分を指定された文字エンコーディングで表示するですか?
1
+ mb_convert_encoding で文字エンコーディングを変換したときに、メーラー側ではその一部分を指定された文字エンコーディングで表示するですか?
body CHANGED
File without changes

1

入力画面・送信画面のコード追加

2017/05/01 11:51

投稿

7968
7968

スコア253

title CHANGED
File without changes
body CHANGED
@@ -22,12 +22,56 @@
22
22
 
23
23
  ご存じの方いれば、教えてください((_ _ (´ω` )ペコ
24
24
 
25
+ 入力画面
25
26
 
26
27
  ```php
27
28
  <?php
28
29
  // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策)
29
30
  header('X-FRAME-OPTIONS: SAMEORIGIN');
31
+ ?>
32
+ <!DOCTYPE html>
33
+ <html lang="ja">
34
+ <head>
35
+ <meta charset="UTF-8">
36
+ <title>入力画面</title>
37
+ </head>
38
+ <body>
30
39
 
40
+ <h1>お問い合わせ(入力画面)</h1>
41
+
42
+ <form method="post" action="confirm.php">
43
+ <table>
44
+ <tr>
45
+ <th>お名前(必須)</th>
46
+ <td><input type="text" name="name"></td>
47
+ </tr>
48
+ <tr>
49
+ <th>ふりがな(必須)</th>
50
+ <td><input type="text" name="ruby"></td>
51
+ </tr>
52
+ <tr>
53
+ <th>メールアドレス(必須)</th>
54
+ <td><input type="text" name="mail"></td>
55
+ </tr>
56
+ <tr>
57
+ <th>内容(必須)</th>
58
+ <td><textarea name="content"></textarea></td>
59
+ </tr>
60
+ </table>
61
+ <button>送信内容確認</button>
62
+ </form>
63
+
64
+ </body>
65
+ </html>
66
+ ```
67
+
68
+ 確認画面
69
+
70
+ ```php
71
+ <?php
72
+ // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策)
73
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
74
+
31
75
  // IEで発生するコンテンツタイプSniffing対策
32
76
  header('X-Content-Type-Options: nosniff');
33
77
 
@@ -40,6 +84,157 @@
40
84
  // セッション開始
41
85
  session_start();
42
86
 
87
+ // HTML特殊文字をエスケープする関数
88
+ function h($str) {
89
+ return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
90
+ }
91
+
92
+ /* --------------------------------------------------
93
+ トークンの作成(CSRF対策)
94
+
95
+ ※使用しているPHPのバージョン・環境にあわせて
96
+ トークンを選んでね。不要なトークは削除してね。
97
+ -------------------------------------------------- */
98
+
99
+ // PHP 7.0 以降
100
+ //if(!isset($_SESSION['token'])) {
101
+ // $_SESSION['token'] = bin2hex(random_bytes(32));
102
+ //}
103
+
104
+ // PHP 5.3 ~ 5.x ※OPENSSL導入済
105
+ if(!isset($_SESSION['token'])) {
106
+ $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
107
+ }
108
+
109
+ // PHP 5.3 未満
110
+ //if(!isset($_SESSION['token'])) {
111
+ // $_SESSION['token'] = hash('sha256', session_id());
112
+ //}
113
+
114
+ // トークンを代入
115
+ $token = $_SESSION['token'];
116
+
117
+ ?>
118
+ <!DOCTYPE html>
119
+ <html lang="ja">
120
+ <head>
121
+ <meta charset="UTF-8">
122
+ <title>確認画面</title>
123
+ </head>
124
+ <body>
125
+
126
+ <h1>お問い合わせ(確認画面)</h1>
127
+
128
+ <?php
129
+
130
+ // POSTされたデータを変数に代入(magic_quotes_gpc = On + NULLバイト 対策)
131
+ foreach (array('name','ruby','mail','content') as $v) {
132
+ $$v = filter_input(INPUT_POST, $v, FILTER_DEFAULT, FILTER_FLAG_STRIP_LOW);
133
+ }
134
+
135
+ $error_flag = 0;
136
+
137
+ // 必須項目は未入力をチェック
138
+ if ($name === '' || $name === NULL) {
139
+ echo '<p>お名前をご入力してください。</p>';
140
+ $error_flag = 1;
141
+ } elseif (mb_strlen($name) > 50) {
142
+ echo '<p>お名前は 50 文字以内で入力してください。</p>';
143
+ $error_flag = 1;
144
+ }
145
+
146
+ if ($ruby === '' || $ruby === NULL) {
147
+ echo '<p>ふりがなをご入力してください。</p>';
148
+ $error_flag = 1;
149
+ } elseif (mb_strlen($ruby) > 50) {
150
+ echo '<p>ふりがなは 50 文字以内で入力してください。</p>';
151
+ $error_flag = 1;
152
+ }
153
+
154
+ if ($mail === '' || $mail === NULL) {
155
+ echo '<p>メールアドレスをご入力してください。</p>';
156
+ $error_flag = 1;
157
+ } elseif (mb_strlen($mail) > 100) {
158
+ echo '<p>メールアドレスは 100 文字以内で入力してください。</p>';
159
+ $error_flag = 1;
160
+ } elseif (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
161
+ echo '<p>メールアドレスの形式が正しくありません。</p>';
162
+ $error_flag = 1;
163
+ }
164
+
165
+ if ($content === '' || $content === NULL) {
166
+ echo '<p>内容をご入力してください。</p>';
167
+ $error_flag = 1;
168
+ } elseif (mb_strlen($content) > 500) {
169
+ echo '<p>内容は 500 文字以内で入力してください。</p>';
170
+ $error_flag = 1;
171
+ }
172
+
173
+ // エラーがある場合は、戻るボタンを表示し、エラーがない場合は、確認画面を表示
174
+ if ($error_flag === 1) {
175
+ echo '<button onClick="history.back(); return false;">戻る</button>';
176
+ } else {
177
+ // セッション変数に代入
178
+ $_SESSION['name'] = $name;
179
+ $_SESSION['ruby'] = $ruby;
180
+ $_SESSION['mail'] = $mail;
181
+ $_SESSION['content'] = $content;
182
+
183
+ // 確認用画面の表示
184
+ ?>
185
+
186
+ <form method="post" action="send.php">
187
+ <table>
188
+ <tr>
189
+ <th>お名前</th>
190
+ <td><?php echo h($name); ?></td>
191
+ </tr>
192
+ <tr>
193
+ <th>ふりがな</th>
194
+ <td><?php echo h($ruby); ?></td>
195
+ </tr>
196
+ <tr>
197
+ <th>メールアドレス</th>
198
+ <td><?php echo h($mail); ?></td>
199
+ </tr>
200
+ <tr>
201
+ <th>内容</th>
202
+ <td><?php echo nl2br(h($content)); ?></td>
203
+ </tr>
204
+ </table>
205
+ <input type="hidden" name="token" value="<?php echo h($token); ?>">
206
+ <button>送信</button>
207
+ </form>
208
+
209
+ <?php
210
+ }
211
+
212
+ ?>
213
+
214
+
215
+ </body>
216
+ </html>
217
+ ```
218
+
219
+ 送信画面
220
+
221
+ ```php
222
+ <?php
223
+ // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策)
224
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
225
+
226
+ // IEで発生するコンテンツタイプSniffing対策
227
+ header('X-Content-Type-Options: nosniff');
228
+
229
+ // XSSフィルタの設定
230
+ header('X-XSS-Protection:1; mode=block');
231
+
232
+ // HttpOnly属性 の指定
233
+ ini_set('session.cookie_httponly', 1);
234
+
235
+ // セッション開始
236
+ session_start();
237
+
43
238
  // mb_send_mail のエンコーディング
44
239
  mb_language('ja');
45
240