"内容类型不允许"上传SVG文件时,即允许的白名单

时间:2015-02-03 17:06:34

标签: file-upload svg struts2 mime-types struts2-convention-plugin

  

重要提示:Struts版本2.3.24 中修复了以下问题。

     

从该版本开始,无需转义任何角色。

     

了解详情:JIRA Issue WW-4457


我已经配置了Struts2 FileUpload拦截器以允许内容类型的白名单。

这适用于与指定的Content-Type匹配的任何文件,但不适用于SVG个文件have MIME media type image/svg+xml

使用此配置:

@Action(value = "upload", 
    interceptorRefs = @InterceptorRef( 
        value = "defaultStack",
        params = { "fileUpload.allowedTypes" , "application/pdf,"
                                             + "image/jpeg,"
                                             + "image/gif,"
                                             + "image/png,"
                                             + "image/svg+xml"
                  }))

并上传有效的SVG文件,我收到struts.messages.error.content.type.not.allowed属性定义的错误消息:

  

不允许使用内容类型:{0}“{1}”“{2}”{3}

其中{3}是用户尝试上传的Content-Type;

然后例如:

  

不允许使用内容类型:myFile“Sample.svg”“upload__123__456__78.tmp” image / svg + xml

完全allowedTypes白名单中定义的内容类型相同

请注意,我使用regex模式匹配器,在struts.xml中使用以下常量启用:

<constant name="struts.patternMatcher"  value="regex" />

为什么它不起作用,以及如何使其发挥作用?

2 个答案:

答案 0 :(得分:1)

MIME中的+符号是罪魁祸首。

它以某种方式保留,因此需要进行转义;因为使用Convention插件它在String中,转义反斜杠也需要转义。

使用image/svg\\+xml就像魅力一样:

params = { "fileUpload.allowedTypes" ,    "application/pdf,"
                                        + "image/jpeg,"
                                        + "image/gif,"
                                        + "image/png,"
                                        + "image/svg\\+xml"

我不确定基于XML的标准配置是否也需要这样做。

答案 1 :(得分:1)

fileUpload拦截器使用PatternMatcher来检查允许的mime类型。默认情况下,S2使用WildcardHelper模式匹配器,它将与image/svg+xml一起使用。

通过将默认模式匹配器更改为regexfileUpload拦截器开始使用正则表达式检查允许的类型。 +regex中的一个特殊字符,因此必须像image/svg\\+xml一样进行转义才能正常工作。

注意:在这种情况下更改默认模式匹配器会引入意外行为,并且可能会报告为错误。