これは私のコードです:
MailMessage m = new MailMessage(from, to, subject, body);
SmtpClient s = new SmtpClient("...");
s.Send(m);
subject
とのみbody
がユーザー入力です。
コードは問題ありませんが、「件名」と「本文」がどこから来ているかによって異なります。(ご指摘のとおり)ユーザーが提供する場合は、エンコードしていることを確認する必要があります(HttpServerUtility.HtmlEncode)
私はこれを非常に迅速に調査するためにテスト プロジェクトを作成しようとしていますが、Reflector を見てドキュメントを読んだところ、Subject と Body は厳密に System.Strings として扱われています。必要に応じて、文字列のエンコーディングを明示的に設定します (MailMessage.BodyEncoding)。
このクラスの組み立て方に重大なバグがない限り、他の文字列よりもコード インジェクションの可能性が高くなることはありません。特に、BodyEncoding を UTF-8 などのプレーン テキストに明示的に設定した場合は特にそうです。
EDIT:代わりに、HTMLが本文の一部ではないことを本当に確認したい場合は、正規表現を使用できます
@"<[^>]*>"
Regex.Replace(regex, string.empty) または Regex.Match を使用し、一致が見つかったことを示す戻り値をスローして、一連の山括弧内のものを素朴に取り除きます。
次に、件名と本文を検証する必要があります。
@DavidHall が投稿したリンクから.NET MailMessage クラスはインジェクションセーフですか? 、@Slaks は、to/from が検証されていると述べていますが、本文の内容は検証されていません。そのため、件名と本文を検証する必要があります。
ユーザーに送信する前に、件名と本文を必ずエンコードしてください。ほとんどのシナリオでは、これで十分です。