老葛的Drupal培训班 Think in Drupal
当你编写的代码需要使用用户输入,并将其构建到e-mail消息中时,需要考虑一下两点:
1. E-mail头部用换行符(line feed)来分隔(只有在换行符后面没有空格或者tab键时才被作为头部分隔符)
2..如果你没有检查用户的输入是否包含换行符的话,那么用户就可以在邮件的主体中注入它们自己的头部。
例如,假如你希望用户为他/她的消息输入一个标题,而用户输入了以下内容,它包含转义的换行符 (%0A)和空格(%20)字符:
Have a nice day%0ABcc:spamtarget@example.com%0A%0AL0w%20c0st%20mortgage!
结果将如下所示:
Subject: Have a nice day
L0w c0st mortgage!
...
因此,Drupal内置的邮件函数drupal_mail()使用mime_header_encode()来过滤所有的头部。所有的不能打印的字符将根据RFC 2047编码为ASCII可打印的字符,这样就消除了潜在的风险。这涉及到在字符前面添加前缀=?UTF-8?B?,接着输出基于64位编码的字符,再加上?=。
我们鼓励你使用drupal_mail();如果你不使用它的话,那么你需要自己直接调用mime_header_encode()。