下面我将详细讲解如何实现“IIS图片防盗链和下载的解决方案”。
一、背景
在Web开发和运营过程中,图片防盗链和下载一直是一个受关注的问题。一方面,防止他人盗取图片资产,影响客户体验和降低网站流量和排名;另一方面,提供图片下载功能给有需要的用户,方便他们体验和利用我们的图片资源。
二、解决方案
1. 防盗链
防盗链的实现原理是通过控制HTTP请求头中的Referer字段,判断请求是否来自指定的域名。如果是,则允许访问图片资源;否则返回指定的错误代码或图片。在IIS中,我们可以通过ISAPI过滤器来实现该功能。
1.1 编写ISAPI过滤器
我们可以使用C++或C#等编程语言编写ISAPI过滤器。在这里,我使用C++编写一个简单的过滤器,实现防盗链功能。具体代码如下:
#include "stdafx.h"
#include "Httpfilt.h"
#include "stdio.h"
#include "string.h"
// 防盗链规则
#define ALLOW_REFERER "www.example.com"
// 过滤函数
DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD dwNotificationType, LPVOID pvNotification)
{
DWORD dwRetVal = SF_STATUS_REQ_NEXT_NOTIFICATION;
switch (dwNotificationType)
{
case SF_NOTIFY_URL_MAP:
case SF_NOTIFY_PREPROC_HEADERS:
{
HTTP_FILTER_PREPROC_HEADERS* pHeaders = (HTTP_FILTER_PREPROC_HEADERS*)pvNotification;
const char* pszReferer = pHeaders->GetHeader(pfc, "Referer");
if (pszReferer && strstr(pszReferer, ALLOW_REFERER) == 0)
{
// 非法访问,返回错误代码和图片
pHeaders->SetHeader(pfc, "Content-Type", "image/png");
pHeaders->SetHeader(pfc, "Status", "403 Forbidden");
pHeaders->SetHeader(pfc, "Cache-Control", "no-cache");
pHeaders->WriteClient(pfc, "403 Forbidden\n");
pHeaders->WriteClient(pfc, "您无权访问该资源\n");
pHeaders->WriteClient(pfc, "请联系网站管理员\n");
dwRetVal = SF_STATUS_REQ_FINISHED;
}
break;
}
}
return dwRetVal;
}
// 入口函数
BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
pVer->dwFlags = SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_URL_MAP;
strcpy(pVer->lpszFilterDesc, "Anti-leech filter");
return TRUE;
}
// DllMain函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_PROCESS_DETACH)
DisableThreadLibraryCalls(hModule);
return TRUE;
}
在代码中,我们首先定义了防盗链的规则为ALLOW_REFERER,表示只有来自www.example.com的请求才合法。
然后编写了一个HttpFilterProc函数,这个函数是过滤器的主要逻辑。当收到HTTP请求时,过滤器会先获取并检查Referer是否符合规则,如果不符合,则返回403错误和错误信息。
最后,我们在入口函数GetFilterVersion中设置过滤器的版本号、工作模式和描述信息。
1.2 部署ISAPI过滤器
接下来,我们需要将编写好的ISAPI过滤器部署到IIS中。具体步骤如下:
-
将编写好的.dll文件复制到IIS的安装目录下的“ISAPI”文件夹中。
-
打开IIS管理器,在对应的网站或虚拟目录下选择“ISAPI筛选器”。
-
点击“添加”,输入过滤器名称和ISAPI动态链接库的文件名。
-
设置ISAPI过滤器的优先级,将其放在其他过滤器的前面。
至此,ISAPI过滤器的部署已完成。我们可以在浏览器中访问图片资源,看看是否符合规则。
2. 图片下载
图片下载可以为有需要的用户提供方便快捷的下载链接,以便他们使用和分享我们的图片。在IIS中,我们可以通过额外的URL重定向模块来实现该功能。
2.1 编写URL重定向模块
与ISAPI过滤器相比,URL重定向模块的编写相对简单,只需要一段Rule即可。具体代码如下:
<rewrite>
<rules>
<rule name="Download image" stopProcessing="true">
<match url="^download/([^/]+)/(\d+)/([^/]+)$" />
<action type="Rewrite" url="/images/{R:1}/{R:2}/{R:3}" />
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="MSIE" negate="true" />
</conditions>
<serverVariables>
<set name="RESPONSE_Content-Disposition" value="attachment; filename={R:3}" />
<set name="RESPONSE_Content-Type" value="image/jpeg" />
</serverVariables>
</rule>
</rules>
</rewrite>
这里的Rule定义了一个匹配模式,当URL符合“/download/{folder}/{id}/{filename}”时,则重定向到/images/{folder}/{id}/{filename}。同时,根据HTTP请求头中的User-Agent判断是否是IE浏览器,并设置Content-Disposition和Content-Type,以便浏览器正确地保存文件。
2.2 部署URL重定向模块
与ISAPI过滤器不同的是,URL重定向模块不需要编译和部署,只需要在IIS中开启Rewrite模块即可。具体步骤如下:
-
打开IIS管理器,在对应的网站或虚拟目录下选择“URL重写”。
-
点击“添加规则”,选择“空白规则”。
-
输入规则名称,并在“匹配模式”中输入/^download\/([^\/]+)\/(\d+)\/([^\/]+)$/i。
-
在“操作”中选择“重写请求”为/images/{R:1}/{R:2}/{R:3}。
-
在“条件”中加入“{HTTP_USER_AGENT}”不为“MSIE”时。
-
在“服务器变量”中添加“RESPONSE_Content-Disposition”为“attachment; filename={R:3}”和“RESPONSE_Content-Type”为“image/jpeg”。
-
点击“应用”或“添加规则”。
至此,URL重定向模块的配置已完成。我们可以在浏览器中访问/download/{folder}/{id}/{filename},看看是否正确下载了图片。
三、总结
本文主要介绍了IIS图片防盗链和下载的解决方案。其中,防盗链的实现需要编写ISAPI过滤器,通过检查HTTP请求头中的Referer实现防止盗链。而图片下载则需要使用URL重定向模块,将特定的URL重定向到图片资源的真实位置,并设置响应头内容,方便用户下载和保存。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IIS图片防盗链和下载的解决方案 - Python技术站