hentaimanさんの回答で十分かとは思いますが、ちょっと補足します。
ウェブアプリケーションの実行環境がApacheで、言語がPHPの場合
これはちょっと違っています。この場合「ウェブアプリケーション」というのは、PHPで書かれたアプリケーションのことを指します。なので、「実行環境」とは主にPHPの方を指します。Ruby on Railsのアプリケーションの場合は、Ruby on Railsの環境全体です。
なので、「用意されているメール送信用API」は、PHPの場合、mail関数やmb_send_mail関数を指します。
PHPMailerみたいな高機能なライブラリの方がいいじゃないかという意見もありそうですね。ここは解釈が分かれるかもしれませんが、有名なライブラリなら大丈夫ではないかと思います。ライブラリ関数に脆弱性がある可能性もあるのですが、有名なものなら脆弱性があっても指摘され、修正されるだろうという期待からですね。
あと、「ウェブアプリケーションの実行環境や言語に用意されているメール送信用API」でないものは何を指すかということも重要です。そのヒントは、安全なウェブサイトの作り方の後半に出てきます。同書P100(PDFのページではなく冊子としての印刷されたページ番号です)に「3.8 メールヘッダ・インジェクションの例」として、失敗例が紹介されています。ここで使われている方法は、sendmailコマンドを呼び出すというものです。つまり、「メール送信用API」とは、このような手作りのメール送信ではなく、言語等で用意されたものを使えという意味だということが分かります。
ただし、昔はsendmailコマンドを呼び出してメール送信することはわりとありましたが、最近そういうことをする人は少ないと思うので、分かりにくい書き方だなとは思いました。
詳しいコメントをありがとうございます。
以下の部分ですが、
mail関数のマニュアルに、以下の記述がありました。
PHP 5.4.42 および 5.5.27 より前のバージョンでは、additional_headers は、
メールヘッダインジェクション対策を行っていませんでした。
したがって、指定したヘッダが安全なものであり、ヘッダ以外のものを含まないようにするのは
ユーザー側の役目となります。
ふーむ。バージョンによっても違うと…
公式マニュアルを読み込んで意味を理解しないとダメですね。
ここのマニュアルの記載は不正確です。確かにPHP 5.4.42などで「改善」はされた(正確にはPHP 5.4.42、PHP 5.5.26、PHP 5.6.10以降です)のですが、完全にメールヘッダインジェクションが防げるようになったわけではありません。
以下のテストスクリプトは「全てのPHPバージョン」でメールヘッダインジェクション攻撃が可能なサンプルです。Ccヘッダを追加しています。
PHP
1<?php
2 $to = 'alice@example.jp';
3 $subj = 'test';
4 $body = 'test';
5 $ah = "From: bob@example.net\r\nCc: carol@example.com";
6 mail($to, $subj, $body, $ah);
以下は「改善版のPHPでは攻撃できない」サンプルスクリプトです。本文の改ざんを試みています。
PHP
1<?php
2 $to = 'alice@example.jp';
3 $subj = 'test';
4 $body = 'test';
5 $ah = "From: bob@eample.net\r\n\r\nHello!\n";
6 mail($to, $subj, $body, $ah);
このように、「改善版」というのは「一部のメールヘッダインジェクション攻撃を防ぐ」というもので、完全に防御できるわけではありません。
では、どうすれば安全かというと、安全なウェブサイトの作り方にあるように改行文字をチェックするのも一案ですが、PHP 7.2.0以降で導入されたadditional_headers を配列で指定する方法が安全です。以下のような感じですね。
PHP
1<?php
2 $to = ...
3 $subj = ...
4 $body = ...
5 $ah = ["From" => $from];
6 mail($to, $subj, $body, $ah);
これだと、改行を用いたメールヘッダインジェクションはできなくなるので根本的に安全です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/15 04:35