2013-04-17 3 views
9

変数をエスケープしないでPHPでメール本文を生成しているので、ちょっと気分が悪いです。 HTMLでは、htmlspecialchars()または類似の関数をコマンドラインescapeshellarg()に使用していますが、メールには使用していますか?例えば、このような何か:メール本文の変数を引用/エスケープする

<?php 
$usercontent = $_GET['usercontent']; 
mail("[email protected]", "My Subject", "My body with $usercontent included"); 
?> 

可能攻撃者は、上記のようなスクリプトで何ができ、どのように私はそのような攻撃から守ることができますか?または、PHP mail()を保存して、なぜですか?

更新

例を参照してください:(ヘッダーがありません!)

  • のContent-Typeはテキストです/無地本体のみが影響を受けている

    • にいくつかの証拠を答えは素敵です
    • MTAは "/ usr/sbin/sendmail -t -i"を持つpostfix sendmailです
  • +0

    メール機能の危険性が高いのは4番目のパラメータであり、ユーザーが生成したコンテンツで使用しない限り、十分に安全だと思います。とにかく、Swiftmailer http://swiftmailer.org/のようなサードパーティのライブラリを使用することをお勧めします。 – arraintxo

    +0

    4番目のパラメータに関するセキュリティ問題については、こちらをご覧ください:http://stackoverflow.com/questions/ 4834337/phps-mail-what-are-potential-issues-to-watch-out-for – arraintxo

    +0

    他のパラメータからのセキュリティ問題に関するコメントをありがとう、私はよく知っている、私はちょうど注射のような体に興味がある複数の部分のメールまたはこのような何か。 – Trendfischer

    答えて

    0

    あなたのメールにHTMLが含まれていれば誰かがメールにそれを挿入できるので、XSS atackに対しては保護されていません。

    正常に動作することは、期待するデータをチェックして有効であることです。もし私があなたなら、私はこの文字列を逃れるでしょう。それは何も費用がかからず、あなたがそれを使用しないことの結果を心配する必要はありません。

    +0

    はい、これは私が与えてくれた答えです;-)しかし、どんなタイプのエスケープが適切でしょうか? – Trendfischer

    0

    良い質問です。私はあなたが本文をエスケープする必要はないと信じていますが、ユーザーがアドレスを入力できるようにすると、BCCのようなメールにヘッダーを追加することは可能です。したがって、変数を入れた場合は、追加のヘッダーが追加されていないことを確認するために改行(\n\r)を必ず確認してください。

    +0

    私は改行もエスケープすることを考えましたが、変数は本文の先頭にありません。ヘッダーを追加するにはどうすればいいですか?私の懸念事項は問題の理解にありますが、答えに感謝します。 – Trendfischer

    +0

    私はあなたが個人的に逃げることなく大丈夫だと思います。 – Rijk

    3

    基本的な電子メール本文はプレーンテキストです。 HTMLやマルチパートメッセージのような別のタイプが必要な場合は、MIME拡張子を使用して、Content-Typeを使用してタイプを指定する必要があります(HTMLの場合はtext/html、マルチパートメッセージの場合はmultipart/…など)。

    セキュリティ上の観点から、有害なものを注入する方法はありません(少なくとも仕様ごとではありません)。使用されている文字エンコーディングが宣言されていないにもかかわらず、ASCII以外の文字でも正しく処理されるはずです。

    しかし、このように悪用される可能性のある電子メールクライアントにはいくつかの欠陥が存在する可能性があります。しかし、私はそれを疑う。

    +0

    Imho、これはこれまでのところ最高の答えです。 Content-Type text/htmlはクリアで、multipart/...は危険です。しかし、私の疑いはまだ満たされていません。単一の "。"とは何ですか? "\ r \ n。\ r \ n"のような一行で?これは危険ですか? – Trendfischer

    0

    このメールの本文をこのように考えてみましょう。「ミッションの秘密の宛先は不明です。どのような種類のクライアントがメッセージを読むのかわからないかもしれませんが、ライブでユーザーが提供するエスケープされていないHTMLを表示させたくないと推測できます。多くのクライアントがHTMLでメールを読むので、最も良いことはhtmlentities()のユーザーが提供したメール本文になることです。

    私のエスケープクラスのメソッド。

    <?php 
    class escaper 
    { 
        public function superHtmlEntities($string) 
        { 
         return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', true); 
        } 
    } 
    ?> 
    

    ========================================

    最低限、あなたがあなたの研究をするときに、これ以上のものを考えてみてください。

    <?php 
    $esc = new Escaper(); 
    
    $usercontent = $_GET['usercontent']; 
    mail("[email protected]", "My Subject", $esc->superHtmlEntities("My body with $usercontent included")); 
    ?> 
    
    +0

    HTMLをエスケープすることが最低限必要です。合意した少なくともコンテンツタイプ 'text/html'では。しかし、文字セットには注意してください。二重エンコーディングは問題ありません。一部の検証ライブラリでは、すでにエンコードされた入力があります。 – Trendfischer

    関連する問題