问题描述:
话说有一上传功能,使用struts FileUpload拦截器对上传的文件类型、容量大小进行限制,这里略去实现细节。文件类型限制,允许MS Office下的doc、docx、xls、xlsx、ppt、pptx文件上传,经过一段时间测试后,发现某些客户端(事后总结:某些操作系统(发现多为windows XP的某些ghost精简版)会报出错误信息“上传文件类型不对”。
拦截器配置代码:
<action name="savedatumforadd" class="classRoomAction" method="saveDatumForAdd">
<interceptor-ref name="paramsPrepareParamsStack" />
<interceptor-ref name="fileUpload">
<param name="allowedTypes">application/vnd.ms-excel,application/msword,
application/vnd.ms-powerpoint,text/plain,application/pdf,
application/vnd.openxmlformats-officedocument.wordprocessingml.document,
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
application/vnd.openxmlformats-officedocument.presentationml.presentation
</param>
<param name="maximumSize">102400000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="input">/WEB-INF/templates/input.ftl</result>
<result name="success">/WEB-INF/templates/success.ftl</result>
</action>
跟踪问题:既然类型不对,在Action里查看uploadContentType
private String uploadContentType;
public String getUploadContentType () {
return addflag;
}
public void setUploadContentType (String uploadContentType ) {
this. uploadContentType = uploadContentType ;
}
在调试日志里输出uploadContentType,发现doc、xls、ppt也即office 2003以下版本的文件,在有异常客户端时被输出为application/octet-stream;2007的docx、xlsx、ppts则被输出为application/x-zip-compressed。
进一步查阅FileUploadInterceptor.java源码,可以了解到文件类型的数据来源直接来自客户端,那客户端有没有一个地方像tomcat下web.xml配置mime-mapping的地方呢。网上有网友说起windows注册表,并说到
HKEY_LOCAL_MACHINE->SOFTWARE->Classes->MIME-Database->Content Type
去查看异常的客户端的注册表,发现没有该项。从正常客户机导入此项,还是报同样的错误,发现在HKEY_CLASSES_ROOT下还缺少键.doc .docx等相关键值,从正常客户机导入.doc的相关键值,新开浏览器,上传一个doc文件,不再报错误信息了。
问题的本质:所有浏览器都能根据本操作对文件类型做出判断,但这依赖于当前的操作,就像windows对文件类型的判断依赖于相应的注册表。其他如IOS操作系统也有可能出类似错误。如果客户端的操作系统相关mime-mapping故意置错或是没有数据,此时服务端就会从客户端得到错误的文件类型信息。从本质上来说,像这样从客户端获取文件类型信息来判断文件类型是否正确是比较粗糙的,并有可能被客户端恶意欺骗。
解决问题方案:
1、就上传不了office这几种文件类型,可以找一台正确的mime-mapping相关注册表信息导出。如果有windows下不能上传office这几种文件类型的用户,下载正确的注册表信息文件,并导入。该方案的好处是对于服务端来说相对安全,但这样对用户来说操作上比较麻烦,并且该解决方案且限于mime-mapping,并且不能解决恶意修改mime-mapping的客户端。
2、判断文件类型,放宽判断条件application/octet-stream,application/x-zip-compressed,这样异常的客户端就能上传office文件了,但application/octet-stream实际上对应的是.dll,.a,.bin,.exe,.so等文件类型,application/x-zip-compressed对应.zip文件,放宽了这两个类别,等于这些文件都能上传了。这时可以进一步通过文件扩展名来限制上传的类别。这样的解决方案对于一般用户的需求是足够了,但还是不能解决恶意修改mime-mapping的客户端的情况,另外还存在一种情况就是用户故意把.dll改成.doc来上传,也是无能为力。
3、上传之后的文件类型判断,在第2种办法方案的基础上,在用户成功上传文件后,在服务端的操作层面再次判断其文件类别,因为这个判断是依赖于服务端本身,因此可以确保文件类型检查结果的正确性。这种方案最为安全,但是增加了工作量而且占用服务端更多的资源,如果没有很高的安全要求,可以选择第2种方案,如果需求高级别的安全可以再考虑服务端再做一层。
分享到:
相关推荐
`allowedTypes` 是Struts2的`FileUpload`拦截器中的一个配置项,它允许你指定一个字符串列表,这个列表包含了服务器接受的文件扩展名。这个配置可以防止不受支持或者可能有害的文件类型被上传到服务器。例如,如果你...
这个拦截器在处理表单提交时会检查上传的文件是否符合`allowedTypes`设定的类型。如果上传的文件类型不在列表内,那么文件上传将会被拦截并抛出错误。 `allowedTypes`的配置通常在Action类或者Struts2配置文件...
在这个例子中,我们定义了一个名为`myFileUpload`的拦截器,并指定了允许上传的文件类型为所有图像文件和PDF文件。 #### 4. 文件类型与allowedTypes的转换 在Struts2中,`allowedTypes`接受两种格式的输入:MIME...
总的来说,解决“类型不允许的问题”需要对Struts2的配置、拦截器、Action类和文件处理有深入的理解。通过仔细分析`struts2文件上传类型规则表.txt`,并适当调整配置,你就能成功解决这个问题。同时,为了增强系统的...
-- 配置fileUpload拦截器 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/bmp,image/png,image/jpg,image/gif,application/vnd.ms-excel <param name="maximumSize">200000 <!-- ...
Struts2是一个流行的Java Web框架,它提供了丰富的功能来处理HTTP请求,包括文件上传和下载。在处理中文文件名时,由于编码...记住,关键在于正确配置Struts2的拦截器、请求编码以及在处理文件名时进行适当的编码转换。
在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将详细讨论这个主题。 首先,我们来看配置拦截器的部分。在Struts2中,`struts.xml`是配置文件,...
1. **配置Struts2拦截器**:在struts.xml配置文件中,我们需要为特定Action添加`<interceptor-ref>`标签,引用`fileUpload`拦截器栈,其中包含`fileUploadInterceptor`。例如: ```xml ...
首先,我们需要在Struts2的配置文件(struts.xml)中启用FileUpload拦截器,并配置上传大小限制和临时存储路径: ```xml <interceptor name="fileUpload" class="org.apache.struts2.interceptor....
Struts 2 的 fileUpload 拦截器则负责将这些文件绑定到 Action 对象的属性上,使得开发者可以像操作本地文件一样对上传文件进行处理。 在 Struts 2 中实现文件上传,首先需要在 JSP 页面创建一个支持多部分数据的...
同时,Struts2提供了一个`FileUploadInterceptor`拦截器,用于处理文件上传的相关逻辑,包括验证文件大小。 1. **文件大小设置**: 在Struts2的配置文件(通常为struts.xml)中,我们可以定义一个全局或特定于...
在上述示例中,我们使用了Struts2的`fileUpload`拦截器来处理文件上传,并在Action中实现了文件的保存逻辑。同时,我们还限制了文件的大小和类型,以防止恶意大文件上传或不安全的文件类型。 `TestUpload`可能是这...
而当文件大小介于`struts.multipart.maxSize`和`fileUpload`的`maximumSize`之间时,会触发`fileUpload`拦截器的错误处理,给出“File too large”这样的提示。只有当文件大小小于`fileUpload`的`maximumSize`时,...
当用户提交包含文件的表单时,服务器端的Struts拦截器会捕获请求,然后使用`FileUpload`组件解析请求中的文件数据,将文件内容保存到服务器的临时目录或指定位置。 2. **配置文件上传** 在Struts的配置文件(如...
这可以通过添加一个或多个拦截器栈来完成,如`params`和`fileUpload`拦截器。 ```xml <interceptor-ref name="fileUpload"> <param name="maximumSize">204800</param> <!-- 设置最大上传文件大小 --> ...
在`struts.xml`配置文件中,我们需要为文件上传的Action添加特定的拦截器栈,比如`params`和`fileUpload`拦截器。`fileUpload`拦截器负责处理文件上传的内容。 ```xml ...
为了支持文件上传,需要引入Struts2的FileUpload拦截器。在`<package>`标签内添加以下内容: ```xml <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> ...
除了`fileUpload`拦截器之外,还可以使用其他拦截器来增强Action的功能。例如: ```xml ``` 这里添加了`defaultStack`拦截器栈,它包含了多个常用的拦截器,如参数填充、异常处理等。 ##### 7. **结果配置** ...