我有一个表单并在HTML form
里面,我有文件上传按钮。
文件将使用AJAX
请求上传。
/home/xyz/upload/username/username_timestamp
但是由于我使用的是AJAX请求,我不能(也不想)使用CAPTCHA
,并且存在攻击者泛滥文件的风险。我该如何处理这个问题?
PS:我在我的项目中使用Spring-MVC(不是Spring安全性)和Struts2,因此特定于框架的解决方案将是锦上添花。
答案 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;
}
}
有了这些,客户端必须从服务器获取每个文件上传的令牌。这些都在幕后,不会打扰您的普通用户。