避免ajax文件上传攻击

时间:2017-01-18 14:58:35

标签: spring-mvc file-upload struts2

我有一个表单并在HTML form里面,我有文件上传按钮。 文件将使用AJAX请求上传。

  • 在文件上传时,我正在检查扩展名和文件大小。
  • 我正在将文件上传到/home/xyz/upload/username/username_timestamp

但是由于我使用的是AJAX请求,我不能(也不想)使用CAPTCHA,并且存在攻击者泛滥文件的风险。我该如何处理这个问题?

PS:我在我的项目中使用Spring-MVC(不是Spring安全性)和Struts2,因此特定于框架的解决方案将是锦上添花。

1 个答案:

答案 0 :(得分:0)

使用Strut's token mechanism以及父操作中您预期的文件上传逻辑(例如,每分钟最大上传次数),保护您的操作不受期待!如下所示:

的index.jsp

<form action="upload" method="post" enctype="multipart/form-data">
      <label for="myFile">Upload your file</label>
      <input type="file" name="myFile" />
      <s:if test="uploadsPerMinutes < 10">
      <s:token name="tknUpload" /> <!-- *** conditional generate token *** -->
      </s:if>
      <sj:submit value="Submit Form" targets="myAjaxTarget"/>
   </form>
<div id="myAjaxTarget">
    </div>

struts.xml中

   <action name="upload" class="com.upload.FileUpload">
      <interceptor-ref name="tokenSession/>
      <interceptor-ref name="basicStack"/>
      <result name="success" type="stream">...</result>
   </action>
   <action name="uploadParent" class="com.upload.FileUploadParent">
      <result name="success">index.jsp</result>
   </action>

FileUploadParent.java

public class FileUploadParent extends ActionSupport{
   ...
   public static int uploadsPerMinutes = 0;
   private static DateTime lastUploadTime;

   public String execute()
   {
      ...
   synchronized(uploadsPerMinutes){
      if(currentTime - lastUploadTime > 1min) uploadsPerMinutes=0;
      else uploadsPerMinutes++;
      lastUploadTime = currentTime;
   }
      return SUCCESS;
   }
   public String getUploadsPerMinutes()
   {
      return uploadsPerMinutes;
   }
}

有了这些,客户端必须从服务器获取每个文件上传的令牌。这些都在幕后,不会打扰您的普通用户。