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",
))

编辑:

Hassek 关于使用 Mocker 的建议是我最初没有考虑过的一种方法,并且在这里可以达到我的目的。但是,我很好奇邮件函数中实际触发 BadHeaderError 的原因 - 如果换行符不这样做,主题中需要什么样的特殊字符?还是有另一种触发 BadHeaderError 的方法?我对网络安全不太了解,所以我想学习这些东西。

编辑2:

我使用的是 Django 1.3.0。

4

2 回答 2

2

这个片段来自 Django 自己的测试;这就是他们测试是否引发此错误的方式

def test_header_injection(self):
    email = EmailMessage('Subject\nInjection Test', 'Content', 'from@example.com', ['to@example.com'])
    self.assertRaises(BadHeaderError, email.message)
于 2014-12-03T10:11:06.410 回答
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 回答