by 清泉
11. 十月 2008 09:20
针对图片防盗链,其原理一般就是动态检测来源地址和当前域名是否统一,如是统一的,动态页面将输出图片,如果不统一便跳转到版权说明页面或输出别的图片。下面是一个我已经写好的防盗链的图片显示代码,调用代码为<img src="ShowPicView.Asp?FileName=图片名称" />。这是防盗链代码有需要的直接下载:ShowPicView.rar (859.00 bytes)。
当然仅这样还是不够的,还要让前台输出代码的时候自动把图片替换成这样的链接。因为编辑器上传的时候,他图片的默认地址就是真实的图片地址,而不是<img src="ShowPicView.Asp?FileName=图片名称" />这样的调用,这样就需要在前台输出代码的时候加一个转换函数,将原有真实链接全转到这种链接到防盗的图片显示的动态页面。下面再给出一个转换函数。
注意:此代码最好是在前台使用,后台里面尽量不要使用,这样便可以方便编辑,不会出错。
下面是自动转换图片地址的代码:
<%
Function GetPicHtml(ContentStr)
Dim re,RemoteFile,RemoteFileurl
Dim SaveIMGFileName,SourceFileUrl,GetPicUrl
Set re = New RegExp
re.IgnoreCase = True
re.Global=True
re.Pattern = "<(\/){0,1}img[^<>]*>"
Set RemoteFile = re.Execute(ContentStr)
Set re = Nothing
For Each RemoteFileurl in RemoteFile
if instr(lcase(RemoteFileurl),"/showeditor/uploadfile/")>0 then
GetPicUrl=replace(replace(lcase(RemoteFileurl),"<img src=""/showeditor/uploadfile/",""),""" border=0>","") '这里检测是否是需要转换防盗链的,其中showeditor/uploadfile是自己网站内的图片目录路径。
ContentStr = Replace(ContentStr,RemoteFileurl,"<img src=""ShowPicView.Asp?FileName="&SERVER.URLEncode(GetPicUrl)&"""/>")
end if
Next
GetPicHtml = ContentStr
End function
%>
下面是图片防盗链显示的ASP代码:
<%
From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))
Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))
'防止盗链,设置图片地址
if mid(From_url,8,len(Serv_url)) <> Serv_url then
response.redirect "http://www.supidea.com/logo.gif"
response.end
end if
Function GetFileName(longname)
while instr(longname,"/")
longname = right(longname,len(longname)-1)
wend
GetFileName = longname
End Function
Dim Stream
Dim Contents
Dim FileName
Dim TrueFileName
Dim FileExt
Const adTypeBinary = 1
FileName = Request.QueryString("FileName")
if FileName = "" Then
Response.End
End if
FileExt = Mid(FileName, InStrRev(FileName,".") + 1)
Response.Clear
if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then
Response.ContentType = "image/*" '对图像文件不出现下载对话框
else
Response.ContentType = "application/ms-download"
end if
Response.AddHeader "content-disposition", "attachment; filename= "& GetFileName("/UploadFile/SmallPicFile/"&FileName)
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = adTypeBinary
Stream.Open
'设置服务器文件真实地址
TrueFileName = "/showeditor/uploadfile/"&FileName
Stream.LoadFromFile Server.MapPath(TrueFileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>