回答編集履歴

1

コメントへの返答を追記しました

2021/06/15 07:30

投稿

ockeghem
ockeghem

スコア11705

test CHANGED
@@ -21,3 +21,107 @@
21
21
 
22
22
 
23
23
  ただし、昔はsendmailコマンドを呼び出してメール送信することはわりとありましたが、最近そういうことをする人は少ないと思うので、分かりにくい書き方だなとは思いました。
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ 詳しいコメントをありがとうございます。
32
+
33
+ 以下の部分ですが、
34
+
35
+
36
+
37
+ > mail関数のマニュアルに、以下の記述がありました。
38
+
39
+ > PHP 5.4.42 および 5.5.27 より前のバージョンでは、additional_headers は、
40
+
41
+ メールヘッダインジェクション対策を行っていませんでした。
42
+
43
+ したがって、指定したヘッダが安全なものであり、ヘッダ以外のものを含まないようにするのは
44
+
45
+ ユーザー側の役目となります。
46
+
47
+ > ふーむ。バージョンによっても違うと…
48
+
49
+ 公式マニュアルを読み込んで意味を理解しないとダメですね。
50
+
51
+
52
+
53
+ ここのマニュアルの記載は不正確です。確かにPHP 5.4.42などで「改善」はされた(正確にはPHP 5.4.42、PHP 5.5.26、PHP 5.6.10以降です)のですが、完全にメールヘッダインジェクションが防げるようになったわけではありません。
54
+
55
+
56
+
57
+ 以下のテストスクリプトは「全てのPHPバージョン」でメールヘッダインジェクション攻撃が可能なサンプルです。Ccヘッダを追加しています。
58
+
59
+
60
+
61
+ ```PHP
62
+
63
+ <?php
64
+
65
+ $to = 'alice@example.jp';
66
+
67
+ $subj = 'test';
68
+
69
+ $body = 'test';
70
+
71
+ $ah = "From: bob@example.net\r\nCc: carol@example.com";
72
+
73
+ mail($to, $subj, $body, $ah);
74
+
75
+ ```
76
+
77
+
78
+
79
+ 以下は「改善版のPHPでは攻撃できない」サンプルスクリプトです。本文の改ざんを試みています。
80
+
81
+
82
+
83
+ ```PHP
84
+
85
+ <?php
86
+
87
+ $to = 'alice@example.jp';
88
+
89
+ $subj = 'test';
90
+
91
+ $body = 'test';
92
+
93
+ $ah = "From: bob@eample.net\r\n\r\nHello!\n";
94
+
95
+ mail($to, $subj, $body, $ah);
96
+
97
+ ```
98
+
99
+
100
+
101
+ このように、「改善版」というのは「一部のメールヘッダインジェクション攻撃を防ぐ」というもので、完全に防御できるわけではありません。
102
+
103
+
104
+
105
+ では、どうすれば安全かというと、安全なウェブサイトの作り方にあるように改行文字をチェックするのも一案ですが、PHP 7.2.0以降で導入されたadditional_headers を配列で指定する方法が安全です。以下のような感じですね。
106
+
107
+
108
+
109
+ ```PHP
110
+
111
+ <?php
112
+
113
+ $to = ...
114
+
115
+ $subj = ...
116
+
117
+ $body = ...
118
+
119
+ $ah = ["From" => $from];
120
+
121
+ mail($to, $subj, $body, $ah);
122
+
123
+ ```
124
+
125
+
126
+
127
+ これだと、改行を用いたメールヘッダインジェクションはできなくなるので根本的に安全です。