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

Q&A

解決済

2回答

2437閲覧

実行環境や言語に用意されているメール送信用APIとは何か?

chibi_kuma

総合スコア85

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/06/14 13:32

0

1

IPA 独立行政法人 情報処理推進機構で公開されている
「安全なWebサイトの作り方 第7版」を読んでいます。

メールヘッダ・インジェクションの項目(41P目)に、

「メールヘッダを固定値にできない場合、
ウェブアプリケーションの実行環境や言語に用意されているメール送信用API を使用する。」
という項目がありました。

解説には、
「外部からの入力をメールヘッダに出力する場合、ウェブアプリケーションの実行環境や言語に用意
されているメール送信用API を使用することをお勧めします。」
とあります。

この「ウェブアプリケーションの実行環境や言語に用意されているメール送信用API」というのが、
何を指しているのかが、よく分かりません。

ウェブアプリケーションの実行環境がApacheで、言語がPHPの場合、
「用意されているメール送信用API」とは、何が該当するのでしょうか?

「SendGrid」のようなサービスは、サードパーティ製のメール送信API、
「PHPMailer」は、PHP用メール送信ライブラリになると思うのですが、
「ウェブアプリケーションの実行環境や言語に用意されているメール送信用API」という書き方なので、
そうしたものではなく、Aptcheや、PHPの標準のメール送信APIがあるのかなと思いまして…。

よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答2

0

ベストアンサー

※資料は読んでません

前提知識としてメール送信に必要なプロトコルさえ満たせばメールは送信できます
つまりphpならsocket関数使えばメールは送れるという事になりますがそれはBADで、

「ウェブアプリケーションの実行環境や言語に用意されているメール送信用API」という書き方なので、

例えばメール関数やフレームワークが用意しているメール送信用ライブラリや関数を使おうねって言ってるだけだと思われます

phpに限ればメール送信用APIという抽象的な表現が分かりにくいし例としてmail関数と書くべき内容だと思いますが、対象を限定しない為にメール送信用APIという単語を使ったのでしょう
APIは意味が広すぎるからとりあえず使っておけば大抵の場合は誤用にならなさそうな単語ですし

メールサーバーに拒否されているかどうかを含めて処理に組み込むならソケット関数使ってメール送信処理作るしかないと思いますが、そうでもなければわざわざソケットなんて使う必要ないでしょう

投稿2021/06/14 13:56

hentaiman

総合スコア6431

chibi_kuma

2021/06/15 04:35

hentaimanさん、ご回答ありがとうございました。 なるほど。 私の場合、Socketでのメール送信はしたことが無く、 PHPを触り始めた当初から、mb_send_mail関数を使っていたので、 更にその上のセキュリティ面に優れたメール送信API群があるのかもと 思い込んでしまいました。 理解できました。 ありがとうございます!
guest

0

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/14 23:28

編集2021/06/15 07:30
ockeghem

総合スコア11710

chibi_kuma

2021/06/15 05:02

ockeghemさん、ご回答ありがとうございました。 私は「ウェブアプリケーションの実行環境」のところから、 勘違いをしてしまっていたのですね。 具体的に、PHPの場合は、mb_send_mail関数の事を指していると 教えていただき、ありがとうございました。 私の場合、Socketでのメール送信はしたことが無く、 PHPを触り始めた当初から、mb_send_mail関数を使っていたので、 更にその上のセキュリティ面に優れたメール送信API群があるのかもと 思い込んでしまいました。 また、mail関数を使う言葉、 メールヘッダインジェクション対策になると知りませんでしたので、 「安全なWebサイトの作り方 第7版」が言っているのが、 「mail関数」「mb_send_mail関数」の事だとは、思い至りませんでした。 次に浮かんだ疑問は「mail関数」「mb_send_mail関数」を使うだけで 本当にメールヘッダインジェクション対策になるのか?でした。 マニュアルも確認してみました。 mail関数のマニュアルに、以下の記述がありました。 PHP 5.4.42 および 5.5.27 より前のバージョンでは、additional_headers は、 メールヘッダインジェクション対策を行っていませんでした。 したがって、指定したヘッダが安全なものであり、ヘッダ以外のものを含まないようにするのは ユーザー側の役目となります。 ふーむ。バージョンによっても違うと… 公式マニュアルを読み込んで意味を理解しないとダメですね。 以下の記事も参考になりました。 (参考)PHPへのメールヘッダーインジェクション https://blog.ohgaki.net/php-mail-header-injection
chibi_kuma

2021/06/15 08:12

ockeghemさん、詳しい追加情報をいただき、 本当にありがとうございます…! additional_headersを使う方向で、 プログラムの修正を検討します! 日々「ベストプラクティス」は変わっていくのですね。 特にこのセキュリティにおいての「ベストプラクティス」は、 変化が早くて、なかなか「これが最善」というのを見つけるのが 難しいです。 曖昧な理解のままにしておかず、ここでお尋ねして本当に良かったです。 「安全なWebサイトの作り方 第7版」、 まだ読み進めている最中でして、 分からないところが、まだまだ出てきています。 またここでお尋ねする事があるかと思いますので、 その際は、ご教授いただければ幸いです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問