私のサイトには、ユーザーがテキストフィールドの編集を許可されている機能がありますDrupalフォーム(D7フォームAPIを使用して作成))、そのテキストフィールドのコンテンツを(一部)として送信します別のユーザーへのメールの本文 drupal_mail を使用してメールを送信します。
テキストフィールドはデータベースに保存され、私はSQLインジェクションから保護するためにフォームAPIに依存しています。テキストフィールドがテキストフィールドウィジェットの外側の画面に表示されることはないため、「危険な」HTMLタグやPHP/JavaScriptインジェクションは問題になりません(私はそう思います)。
メールのバックエンドとしてDefaultMailSystem
を使用しています。
ユーザーがこのテキストフィールドにanythingと入力できる場合、このユーザー入力を電子メール本文に含めて送信する前にサニタイズする必要がありますか?
Drupalのテキストフィルタリングシステムを使用する理由は2つあります。セキュリティとコンテキストの情報の適切なフォーマットです。
逆の順序で:
とはいえ、システムがスパムに役立たないようにする必要があります。
もちろん、本文よりもメールの方が多いです。誰かが「宛先」アドレスの一部として改行を使用し、新しいヘッダーを追加して、好きな人からのメールになりすまして、好きな人に送信することができるので、電子メールヘッダーは攻撃のベクトルになる可能性があります。 、その過程でドメインの評判を傷つけます。
もう1つのサイドノート:
テキストフィールドはデータベースに保存され、SQLインジェクションから保護するためにフォームAPIを使用しています。
SQLインジェクション保護は、db_insertまたはdb_query関数でメソッドと引数を適切に使用することで実現されます。フォームAPIからのものではありません。
使用しているメールバックエンドによって異なります。 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基本的なサニタイゼーションが行われますが、まだいくつかの攻撃が可能である可能性があります。