web-dev-qa-db-ja.com

メール本文で使用されるユーザー入力テキストフィールドをサニタイズする必要がありますか?

私のサイトには、ユーザーがテキストフィールドの編集を許可されている機能がありますDrupalフォーム(D7フォームAPIを使用して作成))、そのテキストフィールドのコンテンツを(一部)として送信します別のユーザーへのメールの本文 drupal_mail を使用してメールを送信します。

テキストフィールドはデータベースに保存され、私はSQLインジェクションから保護するためにフォームAPIに依存しています。テキストフィールドがテキストフィールドウィジェットの外側の画面に表示されることはないため、「危険な」HTMLタグやPHP/JavaScriptインジェクションは問題になりません(私はそう思います)。

メールのバックエンドとしてDefaultMailSystemを使用しています。

ユーザーがこのテキストフィールドにanythingと入力できる場合、このユーザー入力を電子メール本文に含めて送信する前にサニタイズする必要がありますか?

4
Free Radical

Drupalのテキストフィルタリングシステムを使用する理由は2つあります。セキュリティとコンテキストの情報の適切なフォーマットです。

逆の順序で:

  • 書式設定:マークダウンフィルターのようなものを使用するか、htmlタグで制限を使用すると、単純な健全性(つまり、h1なし)を使用できる場合、それを削除するフィルターを使用します。
  • セキュリティのために:悪意のあるコードが重要な環境で表示されている場合は、それを削除する必要があります。メールの場合、関連するDOMはメールクライアントであり、ドメインの場合もあります。ただし、JavaScriptを取得するのがその電子メールユーザーのセキュリティ上の弱点である場合は、クライアントの問題です。誰もが(不正な)内容を含む任意のアドレスに任意のメールを送信できるため、本文が(スクリプトなしで)「安全」であることを確認するための電子メール処理の主な考慮事項ではありません。この説明を参照してください g.d.o/securityメール本文のテキストのサニタイズについて

とはいえ、システムがスパムに役立たないようにする必要があります。

  • Flood_controlシステムの使用を検討してください。
  • スパマーにとって使いづらくするために、電子メールメッセージに紹介とクロージャを追加することを検討してください。例:「このメールはexample.comから送信されました。友達が言った:_stuff_here_。質問がある場合は、example.comではなく友達に連絡してください。」

もちろん、本文よりもメールの方が多いです。誰かが「宛先」アドレスの一部として改行を使用し、新しいヘッダーを追加して、好きな人からのメールになりすまして、好きな人に送信することができるので、電子メールヘッダーは攻撃のベクトルになる可能性があります。 、その過程でドメインの評判を傷つけます。

もう1つのサイドノート:

テキストフィールドはデータベースに保存され、SQLインジェクションから保護するためにフォームAPIを使用しています。

SQLインジェクション保護は、db_insertまたはdb_query関数でメソッドと引数を適切に使用することで実現されます。フォームAPIからのものではありません。

4
greggles

使用しているメールバックエンドによって異なります。 DefaultMailSystem 送信時に基本的なサニタイズを実行しますが、メールの仕様のみを考慮し、本文がHTMLである可能性があるという事実を無視します。したがって、送信するものが正式に有効な電子メールであることが保証されますが、有効なHTMLであるとは限りません。身体の消毒に関する正確な部分は:

_// Note: e-mail uses CRLF for line-endings. PHP's API requires LF
// on Unix and CRLF on Windows. Drupal automatically guesses the
// line-ending format appropriate for your system. If you need to
// override this, adjust $conf['mail_line_endings'] in settings.php.
$mail_body = preg_replace('@\r?\n@', $line_endings, $message['body']);
_

メールはフォーマットをかなり受け入れており、本文ではなく他のフィールドに厳しい要件を設定しているので、それで終わりです。

drupal_mail() を使用すると、フォーマットメソッドが呼び出されるため、バックエンドを直接使用するよりも安全です。

_// Format the message body.
$message = $system->format($message);
_

そしてデフォルトのフォーマットメソッドはHTMLを取り除きます:

_  // Convert any HTML to plain-text.
  $message['body'] = drupal_html_to_text($message['body']);
_

大きな問題は-あなたはどれだけ信頼するか drupal_html_to_text() ?テキストを有効にするためにありますが、悪意のある誤用に対する予防策であるとは主張していません。コードを理解している限り、ほとんどの場合それは安全ですが、私が覚えている限り、メールリーダーにはリンクに関連したホールがあり、いずれにせよ悪用される可能性があります。

TL; DR基本的なサニタイゼーションが行われますが、まだいくつかの攻撃が可能である可能性があります。

2
Mołot