亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Asp.Net Core 通過(guò)中間件防止圖片盜鏈的實(shí)例

原創(chuàng) 2017-01-12 10:14:53 366
摘要:一、原理要實(shí)現(xiàn)防盜鏈,我們就必須先理解盜鏈的實(shí)現(xiàn)原理,提到防盜鏈的實(shí)現(xiàn)原理就不得不從HTTP協(xié)議說(shuō)起,在HTTP協(xié)議中,有一個(gè)表頭字段叫referer,采用URL的格式來(lái)表示從哪兒鏈接到當(dāng)前的網(wǎng)頁(yè)或文件。換句話說(shuō),通過(guò)referer,網(wǎng)站可以檢測(cè)目標(biāo)網(wǎng)頁(yè)訪問(wèn)的來(lái)源網(wǎng)頁(yè),如果是資源文件,則可以跟蹤到顯示它的網(wǎng)頁(yè)地址。有了referer跟蹤來(lái)源就好辦了,這時(shí)就可以通過(guò)技術(shù)手段來(lái)進(jìn)行處理,一旦檢測(cè)到來(lái)源

一、原理

要實(shí)現(xiàn)防盜鏈,我們就必須先理解盜鏈的實(shí)現(xiàn)原理,提到防盜鏈的實(shí)現(xiàn)原理就不得不從HTTP協(xié)議說(shuō)起,在HTTP協(xié)議中,有一個(gè)表頭字段叫referer,采用URL的格式來(lái)表示從哪兒鏈接到當(dāng)前的網(wǎng)頁(yè)或文件。換句話說(shuō),通過(guò)referer,網(wǎng)站可以檢測(cè)目標(biāo)網(wǎng)頁(yè)訪問(wèn)的來(lái)源網(wǎng)頁(yè),如果是資源文件,則可以跟蹤到顯示它的網(wǎng)頁(yè)地址。有了referer跟蹤來(lái)源就好辦了,這時(shí)就可以通過(guò)技術(shù)手段來(lái)進(jìn)行處理,一旦檢測(cè)到來(lái)源不是本站即進(jìn)行阻止或者返回指定的頁(yè)面。如果想對(duì)自己的網(wǎng)站進(jìn)行防盜鏈保護(hù),則需要針對(duì)不同的情況進(jìn)行區(qū)別對(duì)待。

如果網(wǎng)站服務(wù)器用的是apache,那么使用apache自帶的Url Rewrite功能可以很輕松地防止各種盜鏈,其原理也是檢查refer,如果refer的信息來(lái)自其他網(wǎng)站則重定向到指定圖片或網(wǎng)頁(yè)上。

如果服務(wù)器使用的是IIS的話,則需要通過(guò)第三方插件來(lái)實(shí)現(xiàn)防盜鏈功能了,現(xiàn)在比較常用的一款產(chǎn)品叫做ISAPI_Rewrite,可以實(shí)現(xiàn)類似于apache的防盜鏈功能。另外對(duì)于論壇來(lái)說(shuō)還可以使用“登錄驗(yàn)證”的方法進(jìn)行防盜鏈。

二、實(shí)現(xiàn)防盜鏈

現(xiàn)在讓我們?cè)贏SP.NET Core中實(shí)現(xiàn)防盜鏈技術(shù)來(lái)保護(hù)我們的應(yīng)用程序和站點(diǎn)文件。這就要通過(guò)ASP.NET Core中的中間件技術(shù),監(jiān)聽(tīng)并處理所有傳入的請(qǐng)求,檢查這些請(qǐng)求是不是來(lái)自我們的應(yīng)用程序。

讓我們來(lái)創(chuàng)建這個(gè)防盜鏈的中間件程序:

public class HotlinkingPreventionMiddleware
{
  private readonly string _wwwrootFolder;
  private readonly RequestDelegate _next;
 
  public HotlinkingPreventionMiddleware(RequestDelegate next, IHostingEnvironment env)
  {
    _wwwrootFolder = envWebRootPath;
    _next = next;
  }
 
  public async Task Invoke(HttpContext context)
  {
    var applicationUrl = $"{contextRequestScheme}://{contextRequestHostValue}";
    var headersDictionary = contextRequestHeaders;
    var urlReferrer = headersDictionary[HeaderNamesReferer]ToString();
 
    if(!stringIsNullOrEmpty(urlReferrer) && !urlReferrerStartsWith(applicationUrl))
    {
      var unauthorizedImagePath = PathCombine(_wwwrootFolder,"Images/Unauthorizedpng");
         
      await contextResponseSendFileAsync(unauthorizedImagePath);
    }
       
    await _next(context);
  }
}

   

在這個(gè)中間件中我們可以看到ASP.NET Core中的Request對(duì)象并沒(méi)有對(duì)Referrer進(jìn)行封裝,想獲取Referrer,就要通過(guò)HTTP頭信息(Headers)進(jìn)行訪問(wèn)。

一般都要有一個(gè)IApplicationBuilder擴(kuò)展:

public static class BuilderExtensions
{
  public static IApplicationBuilder UseHotlinkingPreventionMiddleware(this IApplicationBuilder app)
  {
    return appUseMiddleware();
  }
}

   

最后,使用它只需要在Configure函數(shù)中調(diào)用,上面的擴(kuò)展函數(shù)。

app.UseHotlinkingPreventionMiddleware();

三、真能防?

如何突破防盜鏈?針對(duì)檢查refer的方式,可以在頁(yè)面中間件里面先進(jìn)入目的地址的另外一個(gè)頁(yè)面在轉(zhuǎn)到目的頁(yè)面即可,這樣頁(yè)面的refer就是目的站點(diǎn)自己的,如此,即做到突破。這方面可以使用的工具很多,尤其是成熟的web項(xiàng)目測(cè)試包,如HtmlUnit,直接在請(qǐng)求中設(shè)置refer都是可以的。

如果盜用網(wǎng)站是 https 的 protocol,而圖片鏈接是 http 的話,則從 https 向 http 發(fā)起的請(qǐng)求會(huì)因?yàn)榘踩缘囊?guī)定,而不帶 referer,從而實(shí)現(xiàn)防盜鏈的繞過(guò)。

最后,我只能說(shuō)這種方式,只能在一定程度上進(jìn)行防御,不可能杜絕所有的攻擊,還是建議使用成熟服務(wù)器應(yīng)用的方案,比如Nginx。

更多關(guān)于Asp.Net Core 通過(guò)中間件防止圖片盜鏈的實(shí)例請(qǐng)關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章!

發(fā)佈手記

熱門(mén)詞條