流媒体防盗链防下载
这是个千百年来都没有得到彻底解决的问题.我想归根结底还是因为现在的流媒体播放器本身能够得到流文件的地址的原因,所以单纯的在网页上加密地址的做法已经不太可行了,尽管这种方法可以起到一定的作用.比如让你的老板不能下载.
这里我要介绍的方法是结合了服务器流媒体发布软件的配置,数据库及WEB程序.首先要声明的一点是这篇文章的内容并不全都是我原创的,其中针对rtsp协议的解决思路是由CSDN的朋友wd_6532提供的,而针对mms协议的解决方案则是由我同事和我讨论得出的.现在我们就来看看如何针对不同协议的防盗链防下载的解决方案.
rtsp协议防盗链防下载的解决方案
- 数据库的配置.
- Helix流媒体发布软件的配置.
- WEB程序
思路:通常的情况下,当你打开视频网页时,WEB程序读取数据库得到这个视频的地址,将地址发给你,这时你的流媒体播放器得到这个地址后向流媒体发布软件发出请求,流服务器开始发送数据流,客户端就可以开始播放视频了.现在采取的方法是,当用户打开视频网页时,WEB程序首先读取数据库,得到视频地址,然后用程序随机生成一个用户名和密码,将用户名,密码和发布点存到数据库中,然后将视频地址变成这样的格式:rtsp://UserName@UserPwd:服务器IP/发布点/路径/文件名,将这个地址发给客户端,客户端播放就向流服务器请求这个地址的流媒体,此时就需要Helix从数据库中来验证这个地址是否正确,如果正确,客户端自然就可以观看了,否则不能观看,当用户连接成功后,调用方法将这个用户名和密码从数据库中删除.这样,这个地址就是失效的地址了.
下面来详细说明实现的细节,首先要进行数据库的配置,数据库在这里起到的作用很简单,无非就是判断请求中的用户,密码及发布点是否是存在数据库中的正确的值.所以这里要做的就是在Helix的安装目录中如D:\Program Files\Real\Helix Server\Commerce\database\odbc\mssql中找到ppvdemo.sql,在查询分析器中运行就可以建立了.在运行过程中会提示一些错误.不管它.需要说明的是,这不仅仅有mssql的,还有access,mysql的.成功建立后如图所示:
Hexli流媒体发布软件的配置:这个是整个解决方案中最核心的地方.下面的步骤将说明如何操作:
1.建立ODBC数据源.
打开管理工具中的数据源ODBC,点击系统DSN,点击"添加",如图:
选择SQL Server后,点完成.
在创建到SQL Server新的数据源时,可按下图填写,当然名称是可以自己设置的,但要记住,因为后面要用到.
设置验证登录ID,如下图:
更改数据库,选中刚才建立的数据库,点下一步.
日志文件,消息语言通常默认即可.
点击完成后,将弹出一个测试窗体,点击"测试数据源",如果提示成功,则ODBC的设置就完成了.
2.Helix设置.
当数据源建立成功后,就可以对Helix进行设置了,首先进入Helix的后台管理.首先进行发布点的配置.下图所示就是一个发布点的配置,这里我就不多说各个文本框中所输入的内容对应的功能了:
点击"安全设置",弹出"访问控制","用户数据库","用户认证","商业应用"四个菜单,点击"用户数据库",添加一个数据库,大致设置如图所示:
点击"用户认证",添加一个认证域,数据库就选择刚才添加的那个.大致设置如图所示:
(题外话)此时我们可以点击"增加域中的用户",会弹出一个页面,输入用户名和密码如test就可以了,这时到SQL Server数据库中会看到我们刚才输入的用户名和密码.我们一会要做的就是用WEB程序来代替这里的手工输入,所以此时可以不必这样操作.
下面点击"商业应用",添加新的商业规则,具体说明如图所示:
(题外话)在设置商业应用后,可以点击"许可用户权限",进行用户权限的设置,如test,这里不必操作.
至此,Helix的配置就算是完成了.下面就是程序上的事情了.
3.WEB程序.在经过上面的设置后,就可以开始写相应的程序了.功能其实很简单,主要是当打开页面时,将生成的用户名,密码及发布点存入数据库中.
//判断扩展名
string VodUrl="XXXXXX"; //这是实际的视频地址
string StrProName;
int LastNum=VodUrl.LastIndexOf(".");
StrProName=VodUrl.Substring(LastNum );
switch (StrProName )
{
case ".rmvb":
case ".rm":
string Name=Guid.NewGuid().ToString(); //生成用户名
string Pwd=Guid.NewGuid().ToString(); //生成密码
string PathUrl=""; //发布点
if (VodUrl.IndexOf("/A/")>0) //这是找出相应的发布点,名称可改成实际的发布点名称
{
PathUrl="A/";
}
else if(VodUrl.IndexOf("/B/")>0)
{
PathUrl="B/";
}
else if (VodUrl.IndexOf("/C/")>0)
{
PathUrl="C/";
}
string str1=VodUrl.Substring(0,VodUrl.IndexOf("//")+2);
string str2=VodUrl.Substring(VodUrl.IndexOf("//")+2);
VodUrl=str1+Name+":"+Pwd+"@"+str2;
SqlConnection ConnSql=new SqlConnection("server=localhost;uid=sa;pwd=;database=vod");
ConnSql.Open();
string StrSql="insert into users (userid,password,uuid_writeable,uuid) values ('"+Name+"','"+Pwd+"',1,'')";
SqlCommand SqlCmd=new SqlCommand(StrSql,ConnSql);
SqlCmd.ExecuteNonQuery();
StrSql="insert into permissions (userid,url,url_type,expires) values ('"+Name+"','"+PathUrl+"',1,'')";
SqlCmd.CommandText=StrSql;
SqlCmd.ExecuteNonQuery();
break;
}
此时,视频的地址就经过处理了,然后可以发给用户了.下面的工作就是如何判断用户已经连接成功了,那么就可以删除用户在数据库中的记录了,很遗憾的是,我到现在也没有找到如何实现这种方法,目前我所做的是利用SQL Server的作业功能来定期删除那两个表中的内容.
通过上面的操作就可以实现针对rtsp协议的防资链防下载了,为什么说这种方法只能针对rtsp协议呢?主要是因为Windows的Media不支持这种方法,可以说在对Helix的各种相关配置大多都不能运用在Media上面.所以针对Media的mms协议要采用微软的Windows Media Server流媒体发布软件进行配置了.下面就说说如何操作.
mms协议防盗链防下载的解决方案
微软的Windows Media Server不支持这种通过用户名,密码的方式来实现防资链及防下载功能,实现的方式是使用微软自已的身份验证.
首先对Media Server进行"授权"配置,点击服务器,然后点击右边选项卡中的"属性",如图所示即可:
然后就是对发布点的配置了,建立一个发布点很简单,微软的东西嘛,目标就是简单的让大家没饭吃,所以我这里就不说如何建立发布点了,下面就已已有的默认发布点为例说明一下.点击"默认发布点"后,点"属性",同样的点"授权",如图所示进行配置.
启用上述两个授权后,右键点击"WMS发布点ACL授权",在弹出的菜单中选择"属性",这就是典型的Windows权限设置方式,允许什么样的用户来访问这个发布点中的文件,默认为Everyone和Administrator,此时将它们删除,添加一个IIS匿名用户.
这样就只允许IIS匿名用户来访问发布点的文件了,而IIS匿名用户每次的用户名和密码都不相同(这里我只是觉得好像是如此,不能确定.),所以可以起到防止下载的作用.
下面点击"验证",启用"WMS匿名用户身份验证"
这样针对mms协议的防下载就配置完毕了,但防盗链没有完成,这个Media Server自身不支持防资链,所以就需要写些程序来判断用户是否是通过正确的页面来观看视频了,这里就不举例了.
上述两种解决方案实现过程中遇到的问题
1.如何得知用户是否已成功连接.目前我还不知道判断用户是否成功连接的代码怎么写,暂时就已数据库作业来代替了.
2.Helix和Media Server不能装在一台电脑上,这个问题我在CSDN上问过,在技术讨论群中也讲过,但仍没有得到解决,主要的原因是端口号冲突.
嗯,文章写完了,鉴于本人的水平有限,在本文中所提到的技术名词及解释肯定会存在不正确的地方,还请广大网友指出。