首页 > 解决方案 > 报头操作:SMTP

问题描述

我正面临一个问题,即 fortify 由于以下原因而失败

报头操作:SMTP

我尝试了多种解决方案。但是,fortify 仍然失败。

我的代码如下:

@Override
public Map<String, String> sendEmail(EmailBody parameters, String form) {
    Map<String, String> result = new HashMap<>();
    String emailSubjectValue = parameters.getEmailSubject();

    // Check email subject for Manipulation

    if (isHeaderInjection(emailSubjectValue)) {
      result.put("error", "invalid email Subject");
      return result;
    }

    try{
    ....
      message.setSubject(emailSubjectValue, "UTF-8");
    }...

    private static boolean isHeaderInjection(String value) {
    if (value == null)
        return false;
    else if ((value.indexOf('\n') != -1 || value.indexOf('\r') != -1) || value.indexOf("%0A") != -1) {
        return true;
    }
    return false;

    }
}

即使我在设置 emailSubject 之前进行了检查,扫描仍然失败。

如果有任何解决方案,请告诉我吗?

谢谢

标签: javasmtpfortify

解决方案


据我所知,您必须避免在邮件主题中使用任何 CRLF

由于当应用程序在其输出中包含恶意数据时会出现 SMTP 标头操作漏洞,因此一种合乎逻辑的方法是在将数据用于标头上下文之前立即对其进行验证,并确保没有可能破坏标头结构的非法 CRLF 字符。

在设置主题之前,您可以使用以下方法确保不会发生这种情况:

String normalizedSubject = StringUtils.normalizeSpace(emailSubjectValue);

推荐阅读