2

メールフォームを備えたDjangoビューがあります。ユーザーは件名とメッセージを入力し、それを電子メールとしてサイト管理者に送信できます。このビューがBadHeaderErrorをキャッチできることを確認する単体テストを書きたいと思います。

subject = contact_form.cleaned_data['subject']
message = contact_form.cleaned_data['message']
try:
    mail_admins(
        subject=subject,
        message=message,
    )
except BadHeaderError:
    # I want to test this case.
    messages.error(request, "Sorry, the email could not be sent. An invalid header was found.")
else:
    messages.success(request, "Your email was sent to the admins.")

単体テストで BadHeaderError をトリガーするにはどうすればよいですか?

ヘッダーインジェクションの標準的な例は、件名に改行文字があることを知っています。ただし、件名に改行文字を使用してこのフォームに記入する単体テストを作成しましたが、無効なヘッダー メッセージはトリガーされませんでした。

# This didn't trigger the invalid header message. So how do I do it?
response = self.client.post(reverse('contact_us'), dict(
    subject="Subject goes here\ncc:spamvictim@example.com",
    message="Message goes here",
))

編集:

Mocker を使用するという Hassek の提案は、私が当初は考えていなかったアプローチの手段であり、ここでの目的のために機能します。しかし、メール関数で実際に何が BadHeaderError をトリガーするのか興味があります-改行がそれを行わない場合、件名にはどのような特殊文字が必要ですか? または、BadHeaderError をトリガーする別の方法はありますか? 私はWebセキュリティについてあまり詳しくないので、これらのことを学びたい.

編集2:

私はDjango 1.3.0を使用していました。

4

2 に答える 2

1

mail_admins関数でモッカーを使用して、呼び出されたときにBadHeaderErrorを発生させます。これは次のようになります。

from mocker import Mocker, KWARGS

mocker = Mocker()
raise_error = mocker.replace('COMPLETE_PATH_TO_mail_admins_FUNCTION')  
#  i.e django.contrib.emails.mail_admins

raise_error(KWARGS)
mocker.raise(BadHeaderException)

これはまだテストしていませんが、役立つはずです:)

于 2012-09-23T04:58:25.837 に答える