質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

セキュリティー

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

PHP

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

Q&A

3回答

2493閲覧

[PHP]ユーザが入力した文字列をmailコマンドで安全に送信する

test001

総合スコア19

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

セキュリティー

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

PHP

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

0グッド

2クリップ

投稿2017/03/13 05:09

ユーザがフォームに入力した文字列を、例えば以下のように
echo ${入力文字列} | mail -s 'タイトル' 宛先@yahoo.co.jp
などとして送る場合、意図しない危険な文字列が入力されるような気がしてなりません(XSSに似た脆弱性があるような気がします。知識不足で申し訳ないです。)

ユーザの入力した文字列を上記のコマンドで送信したいのですが、入力文字列をhtmlspecialcharsのような安全な文字列に変換する方法はありませんか?
また、上記のコマンドで考えられる危険性などあれば教えていただきたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

メール本文であれば、危険な文字・文字列はありません。
(ただし、UTF-8以外のエンコードの日本語だと、意図通りには送られないでしょう)

しかし、コマンドをどうやって実行するかによって、シェル的な危険はあります。

PHP

1$foo = ";rm -rf /;echo"; 2system("echo $foo | mail -s 'タイトル' 宛先@yahoo.co.jp");

は駄目です。

PHP

1$foo = "';rm -rf /;echo '"; 2system("echo ".escapeshellarg($foo)." | mail -s 'タイトル' 宛先@yahoo.co.jp");

のようにしてください。
しかしそれより、

PHP

1$foo = "';rm -rf /;echo '"; 2$p = popen("mail -s 'タイトル' 宛先@yahoo.co.jp","w"); 3fwrite($p,$foo.PHP_EOL); 4pclose($p);

みたいに、シェルを介さずにpopenしたほうが良いと思います。

投稿2017/03/13 06:00

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2017/03/14 08:43

些細な指摘で申し訳ありませんが、popen関数でコマンドを呼び出す場合もシェル(/bin/sh)は経由します。ご指摘の方法の方が安全であることには異論ありません。
otn

2017/03/14 12:40

ありがとうございます。そこちょっと自信が無かったのですが、「$foo をシェル経由させない」という意味に解釈お願いします。
guest

0

otnさんの回答で言い尽くされているのですが、敢えて指摘いたしますと、なぜmailコマンドでメール送信する必要があるのでしょうか? PHPのmail関数あるいはmb_send_mail関数を使ったほうが安全かと思います。その場合でも、内部的には sendmailコマンドが呼ばれるのですが、直接mailコマンドを呼ぶよりは安全です。

投稿2017/03/14 08:45

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Eメールに関しては本質的な脆弱性があることから
自動スクリプトをが走らないような前提のメーラーがほとんどです。
また添付ファイルをあやまってクリックして実行するようなものも
ほぼウィルス対策ソフトで検出してくれますので
よほどのことがない限り変なことにはなりません。

ただし、リンクをクリックさせて不正請求するような前時代的な
詐欺まがいの手法もあるので、しらないメールアドレスからの
Eメールは開かないのが原則です

投稿2017/03/13 05:27

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問