网站网址: http://wapit.cn
网站功能就是实现一个手机与电脑都可以使用的文件上传下载. 可以帮你把手机文件传给电脑以及把电脑文件传给手机.前天晚上才发布出来, 结果昨晚就被人攻击了.
数据库里被人传满了:full your DISK.wma的文件. 一看数据库, 被占用了近3个G(因为考虑到这个文件都不大, 直接用二进制格式保存在数据库的).幸好攻击只持续了一个多小时. 如果他坚持下去的话, 我服务器肯定是被他full了......请教可以如何防止?我现在想到的办法有:
1. 验证码(但给使用带来麻烦)
2. 上传字段中带个隐藏字段请高手支招.
网站功能就是实现一个手机与电脑都可以使用的文件上传下载. 可以帮你把手机文件传给电脑以及把电脑文件传给手机.前天晚上才发布出来, 结果昨晚就被人攻击了.
数据库里被人传满了:full your DISK.wma的文件. 一看数据库, 被占用了近3个G(因为考虑到这个文件都不大, 直接用二进制格式保存在数据库的).幸好攻击只持续了一个多小时. 如果他坚持下去的话, 我服务器肯定是被他full了......请教可以如何防止?我现在想到的办法有:
1. 验证码(但给使用带来麻烦)
2. 上传字段中带个隐藏字段请高手支招.
不过别急,等下你就知道了
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;/// <summary>
///LoginXian 的摘要说明
/// </summary>
public class LoginXian
{
//设置时间 5分钟
private const int DURATION = 5;
public enum ActionTypeEnum
{
//提交页面的次数(在一台机器。相同IP 。连续最多提交10次页面。 如果超出次数 5分钟之内不能在进行提交)
Normal = 10,
Postback = 10
}
public static bool IsValid(ActionTypeEnum actionType)
{
HttpContext context = HttpContext.Current;
if (context.Request.Browser.Crawler) return false;
string key = actionType.ToString() + context.Request.UserHostAddress; int hit = (Int32)(context.Cache[key] ?? 0);
if (hit > (Int32)actionType) return false;
else hit++; if (hit == 1)
{
context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null); }
else
{
context.Cache[key] = hit;
}
return true;
}
}
{
base.OnInit(e); if (!IsPostBack)
{
if (!LoginXian.IsValid(LoginXian.ActionTypeEnum.Normal))
{
Response.Write("您发送得太频繁,被系统限制5分钟!请5分钟后在重新输入!");
Response.End();
}
}
else
{
if (!LoginXian.IsValid(LoginXian.ActionTypeEnum.Postback))
{
Response.Write("您发送得太频繁,被系统限制5分钟!请5分钟后在重新输入!");
Response.End();
}
}
}放到你的页面的CS上。。然后再Page_Load里调用OnInit()就OK了
else{不会执行}
谢谢 正为手机上传功能苦恼中!
2.IP限制在这个项目中不可行. 因为移动手机用户大多数采用CMWAP上网, 这样的话同一个城市甚至一个省都是同一个IP地址(网关IP).
我想到的办法就是在上传窗体显示时带一个隐藏字段,保存一段随机字符串, 同时在服务端记录这个字符串的存在. 然后用户上传时先判断这个字段的内容是否在服务器中有记录, 如果没有, 则拒绝上传. 存在则上完, 完事后服务器中删除该记录.
这样有个好处就是用户使用时感受不到, 同时又拒绝了其它地方过来的恶意请求. 但是如果有人写程序模拟出了这个请求过程来针对这个来攻击的话就无能为力了.等高人点评
上传代码我贴在这吧. private void Up()
{
if (Request.Files.Count > 0)
{
try
{
HttpPostedFile file = Request.Files[0];
if (file.ContentLength <= 0 || string.IsNullOrEmpty(file.FileName))
{
if (!string.IsNullOrEmpty(file.FileName))
ltUpResult.Text = "文件没有上传,请选择英文路径文件<br />";
else
ltUpResult.Text = "请选择上传文件<br />";
return;
}
//这里保存file
}
catch
{
ltUpResult.Text = "发生错误,上传失败<br />";
}
}
}
我最近在做 移动窗体上传 你编写代码中 Request.Files[0] 这里面的值 我无法取到
所以 你能放一下 前台的 代码吗?这个网站 是 用 网站窗体编写的吗?
是的话 估计我又要杯具了。
我写WAP网站从来没用过移动窗体以及服务端高级控件的. 顶多用个Literal这种, 输出时才不会自作主张给你整些什么玩意导致一些莫名其妙的问题.
我网站aspx页面中的源代码与你看到的源代码除了动态的提示外, 顶部多了个CodeBehind=....那一行.
用ip限制有用么.黑客做坏事时会发送伪ip,是随机生成的.
http请求包中,加入X-Forwarded-For,ip自己编一个
如果库中没有这个MD5值,文件添入库中。MD5值一样,代表两个文件是一样的,所以没有必要在库中放一样的文件。这样改只要对服务端代码做一些调整,比较好上手。
如果库中没有这个MD5值,文件添入库中
刚对程序进行了改进. 页面加载的时候加载了一个隐藏字段sid放在form中, 值为服务端新生成的一个Guid. 服务端同时将这个Guid值存入缓存中.上传时, 先判断页面传来的sid值, 如果为空或在服务器缓存中找不到该值, 则拒绝上传. 如果找到了, 则删除缓存中的该值, 处理上传文件. 同时在页面加载的时候生成一个新值放入sid......
验证码等内些方法都治标不治本。
因为页面上的sid值是很容易获取到.
机器人自动请求你的上传页面,从response.text中就会查找到sid的值.
然后用xmlhttp自动上传
是这样的. 效果当然比不上验证码. 如果有人刻意跟我过不去的话我也没办法啦......天要下雨, 娘要嫁人, 随他去吧. 呵呵
加这个sid只能防备一些初初级hacker, 闹着玩的人. 对这个站来说, 我想差不多了吧.
想不出我这个站会引来高级黑客恶意攻击的意义. 没跟人有利益冲突, 网站性质公益.......