IIS图片防盗链和下载的解决方案

下面我将详细讲解如何实现“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中。具体步骤如下:

  1. 将编写好的.dll文件复制到IIS的安装目录下的“ISAPI”文件夹中。

  2. 打开IIS管理器,在对应的网站或虚拟目录下选择“ISAPI筛选器”。

  3. 点击“添加”,输入过滤器名称和ISAPI动态链接库的文件名。

  4. 设置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模块即可。具体步骤如下:

  1. 打开IIS管理器,在对应的网站或虚拟目录下选择“URL重写”。

  2. 点击“添加规则”,选择“空白规则”。

  3. 输入规则名称,并在“匹配模式”中输入/^download\/([^\/]+)\/(\d+)\/([^\/]+)$/i。

  4. 在“操作”中选择“重写请求”为/images/{R:1}/{R:2}/{R:3}。

  5. 在“条件”中加入“{HTTP_USER_AGENT}”不为“MSIE”时。

  6. 在“服务器变量”中添加“RESPONSE_Content-Disposition”为“attachment; filename={R:3}”和“RESPONSE_Content-Type”为“image/jpeg”。

  7. 点击“应用”或“添加规则”。

至此,URL重定向模块的配置已完成。我们可以在浏览器中访问/download/{folder}/{id}/{filename},看看是否正确下载了图片。

三、总结

本文主要介绍了IIS图片防盗链和下载的解决方案。其中,防盗链的实现需要编写ISAPI过滤器,通过检查HTTP请求头中的Referer实现防止盗链。而图片下载则需要使用URL重定向模块,将特定的URL重定向到图片资源的真实位置,并设置响应头内容,方便用户下载和保存。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IIS图片防盗链和下载的解决方案 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • IIS 架设FTP服务器图文教程

    以下是“IIS 架设FTP服务器图文教程”的完整攻略。 IIS 架设FTP服务器图文教程 步骤一:安装IIS IIS是Windows自带的Web服务器,我们需要确保IIS已经正确安装。若未安装IIS,可以通过以下步骤进行安装: 打开 控制面板 -> 程序 -> 启用或关闭Windows功能; 在弹出的对话框中找到 Internet Informa…

    IIS 2023年5月26日
    00
  • IIS的web.config中跨域访问设置方法

    当我们在IIS中进行跨域访问时,需要使用web.config文件进行相关配置。具体的操作流程如下: 在IIS中选择要配置跨域访问的网站,右击该网站后选择“编辑网站”。 找到“HTTP响应头”模块,点击“添加”按钮,随后输入“Access-Control-Allow-Origin”作为名称,输入“*”(代表允许任何域名进行跨域访问)作为值,然后保存配置。 下面…

    IIS 2023年5月26日
    00
  • Windows server 2008搭建php运行环境图文详解(php5.3)

    下面是详细讲解“Windows server 2008搭建php运行环境图文详解(php5.3)”的完整攻略。 概述 在Windows Server 2008上搭建PHP运行环境需要先安装IIS Web服务器和PHP解析器模块,然后再配置相关参数,以便让PHP代码能够被IIS正常解析和运行。 安装IIS 首先,我们需要安装IIS Web服务器。具体步骤如下:…

    IIS 2023年5月26日
    00
  • IIS配置与错误提示 解决方法

    关于“IIS配置与错误提示 解决方法”的完整攻略,我可以为您提供以下的内容: IIS配置与错误提示 解决方法 一、IIS配置 1.1 IIS基本概念 Internet 信息服务(IIS)是微软公司的一款Web服务器软件,支持在Windows操作系统上运行。IIS可以对网站进行管理与控制,并提供了许多功能。 1.2 IIS配置过程 安装IIS:根据系统版本运行…

    IIS 2023年5月26日
    00
  • asp.net无法获取iis目录的问题解决方法

    下面是关于“asp.net无法获取iis目录的问题解决方法”的攻略。 问题描述 在使用ASP.NET时,有时候会遇到无法获取IIS发布目录的情况,这会导致无法读取或写入文件等操作。通常表现为System.UnauthorizedAccessException异常,错误消息为“访问被拒绝”。 解决方法 方法一:提高应用程序池权限级别 当ASP.NET运行在II…

    IIS 2023年5月26日
    00
  • iis、apache与nginx禁止目录执行asp、php脚本的实现方法

    一、禁用IIS目录执行ASP脚本方法: IIS默认允许在网站目录中执行ASP脚本,为了提高网站的安全性,可以禁止目录中执行ASP脚本。 打开IIS管理器,选择需要禁止ASP脚本执行的网站或应用程序池,在左侧菜单中选择“HTTP响应头”。 在右侧菜单中点击“添加”,添加一个名称为“Content-Type”、值为“text/plain”的自定义HTTP响应头。…

    IIS 2023年5月26日
    00
  • IIS6中配置PHP的方法 200911

    配置IIS6支持PHP主要需要进行以下几个步骤: 1. 下载PHP 在配置PHP之前,我们需要下载PHP程序。可以到PHP官网下载与IIS6相对应的PHP版本。 下载完成后,解压PHP程序。我们可以将解压得到的文件夹拷贝到特定的目录下,方便后续的使用。 2. 安装IIS6 如果还没有安装IIS6,需要先安装IIS6。可以在“控制面板” -> “添加/删…

    IIS 2023年5月26日
    00
  • Win2003 IIS6.0性能优化指南

    Win2003 IIS6.0性能优化指南 1. 应用程序池设置 为了通过应用程序池达到最佳性能,需要执行如下操作: 1.1 创建应用程序池 创建独立的应用程序池,并且对每个应用程序池设置适当的用户身份验证方式,比如集成式身份验证或基本身份验证。这样做可以使每个应用程序池拥有自己的工作进程,从而避免应用程序之间的干扰。 1.2 配置应用程序池 对于每个应用程序…

    IIS 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部