熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

解決圖片被盜鏈接的問題?

2013-11-13 09:48:32  來源: .NET編程 

  所有的image url都跟上密文比如你在綁定頁面image url時可以這麼做以下是MVC示例其他的差不多

  ImageController

  string path=/Content/;

  string imgName = girljpg;

  long ticks=DateTimeNowTicks;

  //使用當前時間刻度作為待加密對象

  string encryptKey = ticksToString();

  //使用自定義對稱算法加密

  byte[] data = SymmetricEncryptionUtility

  EncryptData

  (

  encryptKey

  ShareDataSymmetricKeyFile

  );

  //使加密後的數據轉換成base

  string encryptedImgName = ConvertToBaseString(data);

  string encryptedEncoding = HttpUtilityUrlEncode

  (

  encryptedImgName

  );

  //將加密後的密文存放在共享數據中

  ShareDataKeyCollectionsAdd(encryptedImgName);

  ViewData[imgUrl] = stringFormat

  ({}{}?key={} path imgName encryptedEncoding);

  自定義Handler專用於處理圖片請求此handler做這麼幾件事

  獲得圖片請求的key即上段代碼中的encryptedEncoding沒有圖片key那就哪裡來送回哪裡去(友好點給個性感圖片送過去)

  應該所有key都經過對稱算法加密so解密先

  判斷請求是否來自本站是本站流程進 否則進

  本站請求再做進一步篩選查看ShareData中是否有包含此key(ShareData是自定義的)存在圖片的key那麼清除ShareData中此key然後正確返回請求圖片不存在那麼同步驟一樣送回去(做ShareData判斷是防止javascript 篡改request head信息)

  不是來自本站的請求可以提供自己的策略我這裡做的是天鏈接過期(因為第一段代碼中用時間刻度做加密所以這裡解密了很好判斷)

  ImageHandler

  public void ProcessRequest(HttpContext context)

  {

  HttpResponse response = contextResponse;

  HttpRequest request = contextRequest;

  string imgKey = requestQueryString[key];

  byte[] data = ConvertFromBaseString(imgKey);

  string decryptedKey = SymmetricEncryptionUtility

  DecryptData

  (

  data

  ShareDataSymmetricKeyFile

  );

  //如果沒有圖片密鑰就返回

  if (imgKey == null) return;

  string imagePath = null;

  //檢查請求是否來自外站

  if (requestUrlReferrer != null)

  {

  if (StringCompare(

  requestUrlHost

  requestUrlReferrerHost

  true

  CultureInfoInvariantCulture) == )

  {

  if (!ShareDataKeyCollectionsContains(imgKey))

  return;

  imagePath = requestPhysicalPath;

  if (!FileExists(imagePath))

  {

  responseStatusCode = ;

  return;

  }

  }

  }

  else//不是本站檢查明文時間軸

  {

  long ticks;

  if (longTryParse(decryptedKey out ticks))

  {

  TimeSpan ts = new TimeSpan

  (

  DateTimeNowTicks ticks

  );

  //如果大於一個月

  if (tsTotalDays > )

  {

  //輸出鏈接過期

  return;

  }

  }

  }

  //移除共享數據中key

  ShareDataKeyCollectionsRemove(decryptedKey);

  responseContentType = image/

  + PathGetExtension(imagePath)ToLower();

  responseWriteFile(imagePath);

  }

  因為是自定義Handler注意在config中注冊handler節點至於配置節不知道什麼意思自己查查

  nfig

  <httpHandlers> <add verb=* path=*gif type=

  MvcAppHandlerImageHandler/>

  <add verb=GET path=*jpg type=MvcAppHandlerImageHandler/>

  </httpHandlers>

  以上的解決方案只代表個人並不代表官方哈哈當然對ShareData並沒有做並發等處理只是簡單的實現還望提供更多的思路當然可以通過配置iis 禁止外站請求圖片不過這種限制太過強硬了騰訊qzone裡的圖片好像就不能在外站引用


From:http://tw.wingwit.com/Article/program/net/201311/11636.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.