2014-10-09 3 views
0

ASP.NET/IIS 7에서 hotlink 이미지보기를 감지하는 방법이 있습니까? 나는 시청자를 차단하고 싶지 않다. 누군가 구글 이미지 검색에서 나의 이미지를 클릭 할 때 각 정적 이미지에 대한 이미지 뷰 카운터를 증가시켜야한다.ASP.NET은 hotlink 이미지보기를 감지합니다

+0

핫 링크 이미지보기가 사이트의 이미지를 보는 사용자와 다른 점은 무엇입니까? – MikeSmithDev

+0

Hotlink는 전체 웹 페이지 대신 이미지 파일 만 요청합니다. –

답변

2

매우 간단합니다. 추천자 요청 헤더를 확인하고 로컬 도메인과 일치하지 않는 요청을 로깅 할 수 있습니다. 이런 식으로 뭔가 작업을해야합니다 :

using System; 
using System.Linq; 
using System.Web; 

namespace ImageLogger 
{ 
    public class ImageLoggerModule : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.LogRequest += new EventHandler(context_LogRequest); 
     } 

     void context_LogRequest(object sender, EventArgs e) 
     { 
      var context = HttpContext.Current; 

      // perhaps you have a better way to check if the file needs logging, 
      // e.g.: it is a file in a certain folder 
      switch (context.Request.Url.AbsolutePath.Split('.').Last().ToLower()) 
      { 
       case "png": 
       case "jpg": 
       case "gif": 
       case "bmp": 
        if (context.Request.UrlReferrer != null) 
        { 
         if (!"localhost".Equals(
          context.Request.UrlReferrer.Host, 
          StringComparison.CurrentCultureIgnoreCase) 
          ) 
         { 
          // request is not from local domain --> log request 
         } 
        } 
        break; 
      } 
     } 

     public void Dispose() 
     { 
     } 
    } 
} 

당신이 모듈 섹션에서이 모듈에 연결하지의 Web.config에서 : IIS에서 통합 모드의

<system.webServer> 
    <modules> 
     <add name="ImageLogger" type="ImageLogger.ImageLoggerModule"/> 

이 유일한 작품 - 클래식 모드 ASP.NET에서 결코 정적 파일에 대한 이벤트를 가져옵니다.

이제 나는 그것에 대해 생각해 보았습니다. 당신은 현재의 로깅을 모두 스크랩 할 수있다. (나는 추측한다?) 그리고이 모듈을 사용하고 리퍼러 로직을 없앤다. 그렇게하면 로깅을하는 곳이 한 군데 밖에 없습니다.

+0

감사! 그것은 작동하지만 너무 많은 데이터베이스 쿼리가 있고 이미지 로딩 속도가 느려지거나 별도의 스레드에서 로그를 업데이트하기 때문에 더 많은 로깅을 필터링해야합니다. –