在你的网站的首页加上Session,在下载页面里面检查这个Session。

解决方案 »

  1.   

    哈哈,最好的方法是公布一个帐号/密码,然后在下载的页面上验证session / header 都可以用来验证
      

  2.   

    或者用 动态软件名,下载的时候先把软件读出来,然后改名 header 出来下载
      

  3.   

    检查 http 请求 的 header
    看看 reference 是不是你的网站
    好像是这个变量,去查一查
      

  4.   

    这是我在一个音乐站点发现的,可以做到你的要求,下面是点击下载链接后的页面代码,有些长,注意看其中的js代码<script language="JavaScript">var message='雅燃新世纪纯音乐伊甸园http://www.flamesky.org/www.54music.com版权所有'; 
    function click(e){ 
    if (document.all) { 
    if (event.button == 2) { 
    alert(message); 
    return false; 


    if (document.layers) { 
    if (e.which == 3) { 
    alert(message); 
    return false; 



     
    if (document.layers) { 
    document.captureEvents(Event.MOUSEDOWN); 
    document.captureEvents(Event.MOUSEUP); 

    document.onmousedown=click; 
    document.onmouseup=click; 
     
    function informkey () { 
       keypushed=(event.keyCode); 
       if (keypushed==17){ 
          alert("雅燃新世纪纯音乐伊甸园http://www.flamesky.org版权所有") 
       } 

    </script>
    <script language="Javascript">
    function openWindow(url) {
        popupWin = window.open(url, 'Photo', 'width=620,height=420,scrollbars=1');
        if (popupWin.focus!=null)
        popupWin.focus();
    }
    // --></script>
    <HTML><HEAD><TITLE>歌曲名:01-Whispers-3:46</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK 
    href="1.css" type=text/css rel=stylesheet>
    -----------注释:这里是由php动态生成的,跳转到文件所在地址------------------------
    <META HTTP-EQUIV="refresh" CONTENT="1; url=http://www.flamesky.org/music-files/newotherwma/John Boswell/Love/01-Whispers.wma">
    --------------注释:这个地方是由上个页面传进来的地址,比较安全的做法是传入文件名,从数据库里检索地址--------------------------------
    <body onKeyDown="informkey()" topmargin="0" leftmargin="0" bgcolor="#000000">
    <p><font color="#FFFFFF">请等候....</font>  </p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <form method="post" action="123.asp" name="act">
          
      <table border="0" cellspacing="0" width="778" align="center">
        <tr align="center" valign="middle"> 
          <td width="100%">
    <div align="center"> 
                  <center>
                    <table border="0" width="600"
        bgcolor="#000000" cellspacing="1" cellpadding="7" align="center">
                      
                  <tr align="center"> 
                    <td width="100%"><b> 
                      <input type="text" name="remain_time" disabled size="1" value="6" maxlength="1">
                      <script language="javascript">function IsAllChecked ()
    {  var quNum = 1;
     var hasChecked = false;
     var allChecked = true;
     
     
     for( i = 0 ; i < quNum ; i ++ )
     {
    var no = "document.act."+"q_"+i+".value";
    var count = "document.act.an_id_"+eval(no)+".length"; for(j=0; j< eval(count); j++)
    {
       var answer = "document.act.an_id_"+eval(no)+"[j].checked";
       var temp = "document.act.an_id_"+eval(no)+"[j].focus()";
       if (eval(answer))
       {
     hasChecked = true;
     break
       }
           else
       {
         hasChecked = false;
     eval(temp);
       }
    }

        if (hasChecked == false)
        {
      alert ("");
      allChecked = false;
      break
        }
     }
     
     if(allChecked == true)
     {
       document.act.ok.value = 1;
       document.act.submit();
     }
    }
    function time_step()
    {
            with(document.act.remain_time)
            {
                    value=(value!=0)?value-1:0;                if(document.act.remain_time.value<=0)
                    {
                            alert("请点击退出!");
    location.href ='javascript:window.close()'
    }
    else
    {
            window.setTimeout("time_step()",1000);
    }
    }
    }
    time_step();
    </script>
                      </b> </td>
                      </tr>
                    </table>
                    
                <font color="#000000"> <br>
                    </font>
                  </center>
                </div>
                </td>
            </tr>
          </table>
        </form>
        
    <div align="center">
      <center>
        <div align="center"></div>
      </center></div>
    </BODY>
    </HTML>
      

  5.   


    blre()的方法应该是可以的.
    可以通过一个ISAPI过滤器检查所有的下载请求(如果你用的是IIS).客户端的脚本可以解决一部分问题,彻底解决问题是不可能的.
    也可以先用上,毕竟有胜无.
      

  6.   

    其实rockhard做法也不失为一个好方法,不过也繁
      

  7.   

    方法1.用session
        2.用 HTTP_REFERER
    如:
      if (ereg("http.*dddd.com.*",$HTTP_REFERER))
       {
           ....
       }
      else
       {
        .....
       } 
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  8.   

    if (!file_exists($file_dir . $file_name)) { //检查文件是否存在
    echo "文件找不到";
    } else {
    $file = fopen($file_dir . $file_name,"r"); // 打开文件 
    // 输入文件标签
    Header("Content-type:application/octet-stream");
    Header("Accept-Ranges: bytes");
    Header("Accept-Length: ".filesize($file_dir . $file_name));
    //attachment;application/force-download
    if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE"))
     header("Content-Disposition: filename=$filename" ."%20"); // For IE
    else
     header("Content-Disposition: attachment; filename=$filename");// For Other browsers
    //Header("Content-Disposition: filename=" . $filename."%20");
    // 输出文件内容
    echo fread($file,filesize($file_dir . $file_name));
    fclose($file);我用的是读取本地文件再输出文件的方法来防止盗链。但是遇到了很奇怪的问题,我用小猫下只能下1m左右的文件,如果用宽带下载可以下载2m左右的文件。如果用服务器下载则可以完全下载完,于是我想到了文件可能因为是通过程序输出的,所以会有超时时间,但我把超时时间设置足够长之后,还是这个问题。我想程序应该是没问题,我在国外网站找了好多资料这样作是可行的,问题很可能是跟服务器或者php的配置有关,请各位帮忙。
      

  9.   

    php.ini中有个down_max_size=2M(应该差不多,名字记不太清,)将2M改为你需要的大小,重启apache就可以了
      

  10.   

    阿礼,这是我的一个程序。另外我想与你个人邮件交流,我正在做一些东西,想了解有无进一步合作机会。Header("Content-type: application/octet-stream");
    Header("Accept-Ranges: bytes");
    Header("Accept-Length: ".$FileSize);
    Header("Content-Disposition: attachment; filename=".$TargetFileName);fseek($SourceFile,0,SEEK_SET);set_time_limit(0);
    // 只能在非安全模式的服务器上运行for ($i=0;$i<$FileSize;$i++)
    {
      echo chr(ord(fread($SourceFile,1))^(hexdec($Decoder)));
    }说明:最后这个循环做了一个简单异或解密,导致在服务器上出现运行超时,所以使用set_time_limit()解决。如果服务器运行在安全模式下,那么只能用阿礼的方法,这样下载源文件不能加密。大多数 Web Hosting 的服务器都是运行在安全模式下。另外我发现大多数 Web Hosting 的服务器在安全模式下都可以保证能下载完文件。我最大的在普通MODEM上的试验是7MB。
      

  11.   

    刚才我试了您的方法还是不行,我发现每次下载的时间大概都是在5分钟左右,这跟我在php.ini或者iis中设置的超时时间都不同,不管我这里的超时时间设多少,好像并没有太大影响,一般都是下载到5分钟的时候停止了。此外,另外一台服务器我改用win2k+apache,但是运行了几妙下载就停止了。真不知道怎么办才好。
      

  12.   

    用PHP的环境变量$GLOBAL[referer]。判断是来自哪里,以便作出处理。
      

  13.   

    我们以前的电影也有这个问题,
    后来我们做了个程序,可以自动给所有的文件换名字同时更新我们的access数据库。这样呵呵。就没人知道我们的文件叫什么名字了。不知道对你有帮助没有
      

  14.   

    确实如你所说的,利用转向确实有办法获得文件名的,只要点的快。而我用我方法时是通过读取本地的文件再输出,是不通过http的。即使他们有连接地址也只是一个php的地址,所以只要在php输出文件中用referer加以判断就行了。但现在唯一让我苦恼的是,不能下载完全。不知道这是不是跟服务器的性能有关呢。
      

  15.   

    可以把下载页面和下载文件分别放在两个服务器上,称之为A和B。用户Click链接、从A开始下载启动程序时,先用打开Socket的做法把一个唯一性变量Post到B(服务器Post服务器),然后B的Post接收程序立即用此变量值作为文件名生成一个临时文件。这个变量值我使用的是Unix的Time Stamp加一个自定的常量String。然后下载启动程序用一个重定向跳到B上真正的下载程序,同时用Get方式把此变量中的Unix Time Stamp部分传给B下载程序。B下载程序用那个Time Stamp加自定常量String重新形成文件名,然后试图用unlink()去删除对应临时文件。如果能删除,则允许下载。如果不行,证明是盗链,退出。由于用户不能掌握其中服务器之间的直接通信,拿到了URL也没用。
      

  16.   

    阿礼的程序是这样的:echo fread($file,filesize($file_dir . $file_name));关于超时,这个程序是一次将所有数据读入缓冲,我实际使用时不存在超时问题。我是在实际的Unix Web Hosting空间上实现的。如果是上面我的另一个程序:for ($i=0;$i<$FileSize;$i++)
    {
      echo chr(ord(fread($SourceFile,1))^(hexdec($Decoder)));
    }那就存在超时问题。使用时的那个Web Hosting正好不运行在安全模式下,所以用了set_time_limit(0)。
      

  17.   

    是这样的,比如,如果从我们的网站下载,客户必须访问这个页面才能下载http://XXX.XXXXX.net/XXX/eizo/down/show.php?id=367,
    但上面这个页面指向的下面这个直接地址,那些盗链的人直接把地址指向下面这个地址,这种有没有办法防止呢?
    ftp://xxxx.xxxx.net/download/XXX.exe
      

  18.   

    我看用seesion可以的
    在下载页定义一个seesion,然后链接到另一页,在那一页验证这个seesion
    这个方法可行的,大家都可以试试
      

  19.   

    服务器用IIS的话, 可以考虑ISAPI过滤器. 彻底解决问题.
    其他方法都有办法绕过去.