校园网站内视频、电影的下载控制
    刚刚接手一个旧项目,要对系统电影视频下载时,控制只有在事先通过网站的会员登陆验证才可进行。详细说明:
    用户对动感校园网站内的电影视频下载,可以是在访问网站时,点击电影链接下载(只有通过登陆验证才能访问网站)。也可以在只有一个电影链接的情况下,比如这个(http://bbs.smu.edu.cn/campus/movie/show.aspx?ServerID=17&MovieID=3212&FileName=MOVIE-207-2008-07-14-091031.RMVB)在浏览器打开,就可以下载,或者把链接复制到迅雷新建一个任务就可以下载。这种通过URL链接就可以下载的方式,是无须在通过登陆验证就可以进行的。现在的任务就是要令这种情况不能出现,控制用户在通过URL链接下载或者播放时,如果未在网站通过登陆验证时,就会自动返回首页,警告用户先登陆。
    这个任务的难点在于,动感校园网站的IIS服务器是用Windows系统,数据库用SQL Server,而电影所存放的服务器用的是Linux系统,Apache服务器,数据库是mySQL,如何把用户是否已经在网站通过了登陆验证的状态信息,发给存放电影所在的Apache服务器(Linux服务器上面的数据库没有用户的注册信息),从而让用户在直接通过URL链接下载时,从URL链接就可以得到用户的登陆信息。这个如何实现?或者是如何设计链接,已达到效果?或者有哪些解决方法……?
 
    烦请各路高手帮忙思量解决方法,或者建议, 非常感谢!

解决方案 »

  1.   

    生成链接时加入一个授权码,比如由电影名称,用户ip,和服务器端密钥,iis生成链接,传递到apache是再生成以便进行验证。这个应该就能达到你的目的了吧,就算这个链接给了别人,他们的ip,或者你用其他唯一识别符号,也会不一样,验证码也都不一样,应该能防止未经授权的下载了吧。
    不成熟的想法,拿出来给高手指正。
      

  2.   

    谢谢zubairu兄弟的回复 ^_^
    生成链接时加入一个授权码,比如由电影名称,用户ip,和服务器端密钥,iis生成链接,传递到apache是再生成以便进行验证。
    如果验证通过了,返回给用户依然还是电影在服务器的路径链接,客户如果查看源代码,还是能得到电影的链接,这种验证就失去了意义了呀还是要谢谢你的回复!继续等候各路高手的指点…………
      

  3.   

    呵呵,wgbbiao兄弟,你说的两个办法,具体怎么才能实现的?
      

  4.   

    较麻烦,原则上linux服务器也应验证,否则人家都能看到
    一个方法就是,如果linux端没有验证,则在win服务器验证,验证后,后台读linux服务器的图片后返回输
    要以允许linux的电景只允许你的ip或用户名输出登录。但这样的,显然输出要慢的多!
    还有一个就是win后台加一个验证或授权给linux,授权随机但linux能解码,直接跳转到linux输出
      

  5.   

    那就用header发送,实在不行就直接让php读取文件,发送到客户端,但是对于视频文件这样大的,可能会占用很大系统资源,效率低。
      

  6.   

    利用apache的mod_rewrite结合perl脚本,可以实现你的想法在download.php页面生成一个key,然后在下载真正的文件的时候,利用perl去检查是否有这个key
      

  7.   

    我试过apache的mod_rewrite把http://*****.RMVB的链接重定向到验证模块,但是验证过后,还是要返回http://*****.RMVB的链接,又会重定向,这样陷入死循环啦。
    不知我用apache的mod_rewrite的这种用法对不对呢?
      

  8.   

    Lz问题的瓶颈在返回http://*****.RMVB 这里。
    返回着连接改造成这样的,可能解决lz的问题。
    1.追加一个公用的输出影像的php页面
      http://****php?认证key等等
    2.在该公用的认证PHP页面里面
      判定认证key的有效,这个我想对lz来说不是什么问题,最简单的就是
    着这里把认证key送到登陆服务器去确认一下就Ok
    3。认证通过后,调用header把页面的content-type指定成binary的,
    输出方法参考如下:
    header("Cache-Control: public, must-revalidate");
    header("Pragma: hack");
    header("Content-Type: application/octet-stream" );
    header("Content-Length: " .(string)(filesize($fullpath)) );  ----在这里把真实路径支出来。
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header("Content-Transfer-Encoding: binary\n");
      

  9.   

    呵呵,谢谢bigman_lfj兄弟的回复,虽然我不太懂得你说的方法,我还没接触过php,不过这个能用php做
    想请问一下 bigman_lfj ,你所讲的方法,最后返回给用户的链接,如果是在播放器或者浏览器打开,点击查看源文件,是不是能够看到链接,
    而且是http://*****.RMVB这样的链接?
      

  10.   

    这样做时候,只要打开页面自然弹出下载提示对话框
    lz参考一下代码把,提示下载对话框,制定文件名,文件的真实存放只有在
    php解释时候服务器端直到,用户是不知道的。
    <?php
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: filename=dl.zip');
    header('Content-Length: '.filesize('dl.zip')); 
    readfile("dl.zip");  
    ?>
      

  11.   

    用php读取文件再发送到客户端.
      

  12.   

    例如: 你要下载的文件为 http://domain/path/to/file.ext当经过download.php的时候,header("location:http://domain/path/to/file.ext?key=<randomkey>");那么这时候mod_rewrite 利用perl程序来检测这个key,如果存在,则允许下载,否则pass掉这样是不会造成死循环的。如果不经过download.php,直接访问 http://domain/path/to/file.ext,这个时候的通过mod_rewrite传到
    perl程序里面显然是没有key的,所以就不能访问了。
    不过这种方式弄完,好像下载工具没法下载,只能通过浏览器下载.
      

  13.   

    谢谢大家的关注,几天没来了,呵呵
    请问gqming兄弟,怎么设计这个key,key包含了哪些内容呢?
    要不要对电影的链接做一些改动呢?
      

  14.   

    或者说,用户通过什么链接来下载文件?这个吗--http://domain/path/to/file.ext?
      

  15.   

    哥们儿... 这说来说去就是盗链的问题. 之前我也做音乐网的时候想过很多办法,也在程序上做过手脚。
    其实最简单的就是最好的。我给你一个防盗链程序,保你吃顿大肉!联系我:[email protected]