可以把下载页面和下载文件分别放在两个服务器上,称之为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也没用。
看看 reference 是不是你的网站
好像是这个变量,去查一查
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> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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>
blre()的方法应该是可以的.
可以通过一个ISAPI过滤器检查所有的下载请求(如果你用的是IIS).客户端的脚本可以解决一部分问题,彻底解决问题是不可能的.
也可以先用上,毕竟有胜无.
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 [自解压]
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的配置有关,请各位帮忙。
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。
后来我们做了个程序,可以自动给所有的文件换名字同时更新我们的access数据库。这样呵呵。就没人知道我们的文件叫什么名字了。不知道对你有帮助没有
{
echo chr(ord(fread($SourceFile,1))^(hexdec($Decoder)));
}那就存在超时问题。使用时的那个Web Hosting正好不运行在安全模式下,所以用了set_time_limit(0)。
但上面这个页面指向的下面这个直接地址,那些盗链的人直接把地址指向下面这个地址,这种有没有办法防止呢?
ftp://xxxx.xxxx.net/download/XXX.exe
在下载页定义一个seesion,然后链接到另一页,在那一页验证这个seesion
这个方法可行的,大家都可以试试
其他方法都有办法绕过去.