原理:对于大多数服务器,html表单可以向任何服务器的任何url地址提交,攻击者可以利用此点向本来不需要处理表单的页面采用post方式提交大表单,或者向处理表单的页面采用post方式提交大表单,以此来消耗服务器的资源。(提交方式也可以采用其它方式,不局限于post)
1、对于如下表单,可以向任何服务器的任何url提交,如果服务器没有防范,则会处理表单会消耗不必要的资源。比如主页面只需要get请求获取,而攻击则可以向主业使用post发送大量表单到主页,服务器需要处理不必要的表单,如果攻击者发送大量表单,则会给服务器造成不必要的负担。(更严重的是控制表单提交速度)
<form action="http://bbs.xjtu.edu.cn" method="post" enctype="multipart/form-data" name="form1" id="form1">
<label for="name">name</label>
<input type="text" name="name" id="name" />
<label for="file">file</label>
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> <!-- 10MB -->
<input type="file" name="file" id="file" />
<input type="submit" value="提交"/>
</form>
解决方法检查过滤一下信息是否合法:
1、请求的方法(get/post/put...等),过滤掉不必要的请求方法。对于 php 检查$_SERVER["
REQUEST_METHOD"],对于java servlet检查 HttpServletRequest的getMethod()方法。
2、referer头部,php采用$_SERVER["
HTTP_REFERER"], java servlet采用request.getHeader("Referer");
对于合法表表单Referer头部不为空。
3、限制表单的大小:$_SERVER["CONTENT_LENGTH"], servlet采用request.getHeader("Content-Length");
4、限制请求的连接时间
辅助检查:
检查User-Agent: php $_SERVER['HTTP_USER_AGENT'], servlet采用:request.getHeader("User-Agent");
注意:
不能根据IP,因为IP可变,并且局域网多用户上网使用同一IP........