質問編集履歴

2

誤字訂正

2017/05/01 11:51

投稿

7968
7968

スコア253

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

1

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

2017/05/01 11:51

投稿

7968
7968

スコア253

test CHANGED
File without changes
test CHANGED
@@ -46,6 +46,8 @@
46
46
 
47
47
 
48
48
 
49
+ 入力画面
50
+
49
51
 
50
52
 
51
53
  ```php
@@ -56,6 +58,92 @@
56
58
 
57
59
  header('X-FRAME-OPTIONS: SAMEORIGIN');
58
60
 
61
+ ?>
62
+
63
+ <!DOCTYPE html>
64
+
65
+ <html lang="ja">
66
+
67
+ <head>
68
+
69
+ <meta charset="UTF-8">
70
+
71
+ <title>入力画面</title>
72
+
73
+ </head>
74
+
75
+ <body>
76
+
77
+
78
+
79
+ <h1>お問い合わせ(入力画面)</h1>
80
+
81
+
82
+
83
+ <form method="post" action="confirm.php">
84
+
85
+ <table>
86
+
87
+ <tr>
88
+
89
+ <th>お名前(必須)</th>
90
+
91
+ <td><input type="text" name="name"></td>
92
+
93
+ </tr>
94
+
95
+ <tr>
96
+
97
+ <th>ふりがな(必須)</th>
98
+
99
+ <td><input type="text" name="ruby"></td>
100
+
101
+ </tr>
102
+
103
+ <tr>
104
+
105
+ <th>メールアドレス(必須)</th>
106
+
107
+ <td><input type="text" name="mail"></td>
108
+
109
+ </tr>
110
+
111
+ <tr>
112
+
113
+ <th>内容(必須)</th>
114
+
115
+ <td><textarea name="content"></textarea></td>
116
+
117
+ </tr>
118
+
119
+ </table>
120
+
121
+ <button>送信内容確認</button>
122
+
123
+ </form>
124
+
125
+
126
+
127
+ </body>
128
+
129
+ </html>
130
+
131
+ ```
132
+
133
+
134
+
135
+ 確認画面
136
+
137
+
138
+
139
+ ```php
140
+
141
+ <?php
142
+
143
+ // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策)
144
+
145
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
146
+
59
147
 
60
148
 
61
149
  // IEで発生するコンテンツタイプSniffing対策
@@ -82,6 +170,308 @@
82
170
 
83
171
 
84
172
 
173
+ // HTML特殊文字をエスケープする関数
174
+
175
+ function h($str) {
176
+
177
+ return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
178
+
179
+ }
180
+
181
+
182
+
183
+ /* --------------------------------------------------
184
+
185
+ トークンの作成(CSRF対策)
186
+
187
+
188
+
189
+ ※使用しているPHPのバージョン・環境にあわせて
190
+
191
+ トークンを選んでね。不要なトークは削除してね。
192
+
193
+ -------------------------------------------------- */
194
+
195
+
196
+
197
+ // PHP 7.0 以降
198
+
199
+ //if(!isset($_SESSION['token'])) {
200
+
201
+ // $_SESSION['token'] = bin2hex(random_bytes(32));
202
+
203
+ //}
204
+
205
+
206
+
207
+ // PHP 5.3 ~ 5.x ※OPENSSL導入済
208
+
209
+ if(!isset($_SESSION['token'])) {
210
+
211
+ $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
212
+
213
+ }
214
+
215
+
216
+
217
+ // PHP 5.3 未満
218
+
219
+ //if(!isset($_SESSION['token'])) {
220
+
221
+ // $_SESSION['token'] = hash('sha256', session_id());
222
+
223
+ //}
224
+
225
+
226
+
227
+ // トークンを代入
228
+
229
+ $token = $_SESSION['token'];
230
+
231
+
232
+
233
+ ?>
234
+
235
+ <!DOCTYPE html>
236
+
237
+ <html lang="ja">
238
+
239
+ <head>
240
+
241
+ <meta charset="UTF-8">
242
+
243
+ <title>確認画面</title>
244
+
245
+ </head>
246
+
247
+ <body>
248
+
249
+
250
+
251
+ <h1>お問い合わせ(確認画面)</h1>
252
+
253
+
254
+
255
+ <?php
256
+
257
+
258
+
259
+ // POSTされたデータを変数に代入(magic_quotes_gpc = On + NULLバイト 対策)
260
+
261
+ foreach (array('name','ruby','mail','content') as $v) {
262
+
263
+ $$v = filter_input(INPUT_POST, $v, FILTER_DEFAULT, FILTER_FLAG_STRIP_LOW);
264
+
265
+ }
266
+
267
+
268
+
269
+ $error_flag = 0;
270
+
271
+
272
+
273
+ // 必須項目は未入力をチェック
274
+
275
+ if ($name === '' || $name === NULL) {
276
+
277
+ echo '<p>お名前をご入力してください。</p>';
278
+
279
+ $error_flag = 1;
280
+
281
+ } elseif (mb_strlen($name) > 50) {
282
+
283
+ echo '<p>お名前は 50 文字以内で入力してください。</p>';
284
+
285
+ $error_flag = 1;
286
+
287
+ }
288
+
289
+
290
+
291
+ if ($ruby === '' || $ruby === NULL) {
292
+
293
+ echo '<p>ふりがなをご入力してください。</p>';
294
+
295
+ $error_flag = 1;
296
+
297
+ } elseif (mb_strlen($ruby) > 50) {
298
+
299
+ echo '<p>ふりがなは 50 文字以内で入力してください。</p>';
300
+
301
+ $error_flag = 1;
302
+
303
+ }
304
+
305
+
306
+
307
+ if ($mail === '' || $mail === NULL) {
308
+
309
+ echo '<p>メールアドレスをご入力してください。</p>';
310
+
311
+ $error_flag = 1;
312
+
313
+ } elseif (mb_strlen($mail) > 100) {
314
+
315
+ echo '<p>メールアドレスは 100 文字以内で入力してください。</p>';
316
+
317
+ $error_flag = 1;
318
+
319
+ } elseif (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
320
+
321
+ echo '<p>メールアドレスの形式が正しくありません。</p>';
322
+
323
+ $error_flag = 1;
324
+
325
+ }
326
+
327
+
328
+
329
+ if ($content === '' || $content === NULL) {
330
+
331
+ echo '<p>内容をご入力してください。</p>';
332
+
333
+ $error_flag = 1;
334
+
335
+ } elseif (mb_strlen($content) > 500) {
336
+
337
+ echo '<p>内容は 500 文字以内で入力してください。</p>';
338
+
339
+ $error_flag = 1;
340
+
341
+ }
342
+
343
+
344
+
345
+ // エラーがある場合は、戻るボタンを表示し、エラーがない場合は、確認画面を表示
346
+
347
+ if ($error_flag === 1) {
348
+
349
+ echo '<button onClick="history.back(); return false;">戻る</button>';
350
+
351
+ } else {
352
+
353
+ // セッション変数に代入
354
+
355
+ $_SESSION['name'] = $name;
356
+
357
+ $_SESSION['ruby'] = $ruby;
358
+
359
+ $_SESSION['mail'] = $mail;
360
+
361
+ $_SESSION['content'] = $content;
362
+
363
+
364
+
365
+ // 確認用画面の表示
366
+
367
+ ?>
368
+
369
+
370
+
371
+ <form method="post" action="send.php">
372
+
373
+ <table>
374
+
375
+ <tr>
376
+
377
+ <th>お名前</th>
378
+
379
+ <td><?php echo h($name); ?></td>
380
+
381
+ </tr>
382
+
383
+ <tr>
384
+
385
+ <th>ふりがな</th>
386
+
387
+ <td><?php echo h($ruby); ?></td>
388
+
389
+ </tr>
390
+
391
+ <tr>
392
+
393
+ <th>メールアドレス</th>
394
+
395
+ <td><?php echo h($mail); ?></td>
396
+
397
+ </tr>
398
+
399
+ <tr>
400
+
401
+ <th>内容</th>
402
+
403
+ <td><?php echo nl2br(h($content)); ?></td>
404
+
405
+ </tr>
406
+
407
+ </table>
408
+
409
+ <input type="hidden" name="token" value="<?php echo h($token); ?>">
410
+
411
+ <button>送信</button>
412
+
413
+ </form>
414
+
415
+
416
+
417
+ <?php
418
+
419
+ }
420
+
421
+
422
+
423
+ ?>
424
+
425
+
426
+
427
+
428
+
429
+ </body>
430
+
431
+ </html>
432
+
433
+ ```
434
+
435
+
436
+
437
+ 送信画面
438
+
439
+
440
+
441
+ ```php
442
+
443
+ <?php
444
+
445
+ // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策)
446
+
447
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
448
+
449
+
450
+
451
+ // IEで発生するコンテンツタイプSniffing対策
452
+
453
+ header('X-Content-Type-Options: nosniff');
454
+
455
+
456
+
457
+ // XSSフィルタの設定
458
+
459
+ header('X-XSS-Protection:1; mode=block');
460
+
461
+
462
+
463
+ // HttpOnly属性 の指定
464
+
465
+ ini_set('session.cookie_httponly', 1);
466
+
467
+
468
+
469
+ // セッション開始
470
+
471
+ session_start();
472
+
473
+
474
+
85
475
  // mb_send_mail のエンコーディング
86
476
 
87
477
  mb_language('ja');