一个下载网站,只有经过登陆验证才能下载,如何不被盗链?

解决方案 »

  1.   

    用aspx页面输出文件,文件不放在Web目录或者虚拟目录下
      

  2.   

    如果文件不大的话可以直接用Response.WriteFile
      

  3.   

    另外有相当一部份文件比较大,大到100M-500M,600M
      

  4.   

    用httpModule不就可以了?在BeginRequest里面判断请求来源地址.
      

  5.   

    我的做法是做公共的权限配置。在用户登陆的时候将用户名写入数据库或者是XML文档,在登陆后的每个页面继承这个权限,当用户点击下载的时候读出这个用户如果为空则证明这个用户没有登陆,则用户不能使用网站提供的相关功能。......
    代码略
      

  6.   

    to hillywolf(丘陵狼) :
    BeginRequest能对rar,zip等文件有作用吗?我的意思是,比如一个会员登陆后他就可以得到下载地址,比如http://www.aaa.com/download/1.rar,他把这个地址分发给其他人,我怎么阻止这种情况?
      

  7.   

    前一段我用APS.NET作了一个基于拉技术的聊天室,后来想在其中增加点游戏内容,感觉到基于拉技术的响应实时性不好,所以想改为基于拉技术的。
        现已作了尝试,代码如下:// Content.aspx.cs ///////////////////////////////////////////////////////
    public class Content : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    Session.Timeout = 60;
    Response.Write("欢迎 . . .<br>\n");
    Response.Flush();
    Application[Session.SessionID] = Response;
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
    }
    // Send.aspx.cs //////////////////////////////////////////////////////////
    public class Send : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button ButtonSend;
    protected System.Web.UI.WebControls.TextBox TextBox1;

    private void ButtonSend_Click(object sender, System.EventArgs e)
    {
    foreach(string name in Application.AllKeys)
    {
    HttpResponse Response = Application[name] as HttpResponse;
    if(Response!=null && Response.IsClientConnected)
    {
    Response.Write(TextBox1.Text + "<br>\n");
    Response.Flush();
    }
    else
    {
    Application.Remove(name);
    }
    }
    }
    }    可以聊天,但发现一大问题:同时连接的用户被限制在50个左右,再多的就连不上了,并且会导致其他用户也陷于停滞状态。
        请高手答疑解惑,还可另开贴给分!
      

  8.   

    ying8959(阿因) 请你尊重点别人的交流权利。登录之后写到会话的Session中。所有页面都应该首先判断用户的身份。
      

  9.   

    前一段我用APS.NET作了一个基于拉技术的聊天室,后来想在其中增加点游戏内容,感觉到基于拉技术的响应实时性不好,所以想改为基于拉技术的。
        现已作了尝试,代码如下:// Content.aspx.cs ///////////////////////////////////////////////////////
    public class Content : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    Session.Timeout = 60;
    Response.Write("欢迎 . . .<br>\n");
    Response.Flush();
    Application[Session.SessionID] = Response;
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
    }
    }
    // Send.aspx.cs //////////////////////////////////////////////////////////
    public class Send : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button ButtonSend;
    protected System.Web.UI.WebControls.TextBox TextBox1;

    private void ButtonSend_Click(object sender, System.EventArgs e)
    {
    foreach(string name in Application.AllKeys)
    {
    HttpResponse Response = Application[name] as HttpResponse;
    if(Response!=null && Response.IsClientConnected)
    {
    Response.Write(TextBox1.Text + "<br>\n");
    Response.Flush();
    }
    else
    {
    Application.Remove(name);
    }
    }
    }
    }    可以聊天,但发现一大问题:同时连接的用户被限制在50个左右,再多的就连不上了,并且会导致其他用户也陷于停滞状态。
        请高手答疑解惑,还可另开贴给分!
      

  10.   

    各位,感谢大家献计献策。
    但是我的意思是会员登陆,非会员不能登陆这些都已经没有问题了。
    现在的问题是会员登陆后,可以得到下载地址,比如http://www.aaa.com/download/1.rar,现在他把这个下载地址给第3者。我的要求是如何阻止这个第3者直接通过这个下载地址下载文件?
      

  11.   

    另外有相当一部份文件比较大,大到100M-500M,600M.............没有任何方法能防止盗链。只是让盗链多几道工序而已
      

  12.   

    因为你的目录是全体guest都能访问的。你可以操作IIS对象动态增加、删除用户。
      

  13.   

    web.config中分配权限,然后,再在asp页面中进行判断,强行转到你的login.aspx 地址。FormsAuthen...强行跳转。
      

  14.   

    可以设置一个下载的页面,在下载的这个页面里面判断用户是否登录,如果用登录再用Response.WriteFile的方法输出这个文件
    如果没有,就不输出这个文件
      

  15.   

    ziffle(朱峰):能否说的详细点?
      

  16.   

    楼主的问题应该不属于盗链,而是未经授权下载吧?对于未经授权下载,解决方法当然是检查授权啦,反正就是先通过Cookie、Session或者其他方式检查用户是否授权后,再决定是否为用户提供内容。这个其实和需要授权才能看的页面之间是没有什么是执行差别的,只是页面都是aspx,所以你会觉得容易控制,而文件的话后缀就不确定。如果你的项目规模比较大,还是用HttpModule拦截或者HttpHandler吧。特别是对于大型站点,而且你的文件需要索引,那么应该用数据库保存文件,同时用HttpHandler(而非aspx)进行文件的返回。如果是轻量级的,那么用aspx进行文件返回就行了,不过需要注意一下如何让可以端正确保存文件名。