asp.net防止图片盗链源代码

  asp.net防止图片盗链有以下几种方法。
  1.所有的image url都跟上密文.比如你在绑定页面image url时可以这么做.以下是MVC示例.其他的差不多.

  ImageController
+展开
-C#

  string path="/Content/";

  string imgName = "girl.jpg";

  long ticks=DateTime.Now.Ticks;

  //使用当前时间刻度作为待加密对象

  string encryptKey = ticks.ToString();

  //使用自定义对称算法加密

  byte[] data = SymmetricEncryptionUtility.EncryptData

  (

  encryptKey,

  ShareData.SymmetricKeyFile

  );

  //使加密后的数据转换成base64码

  string encryptedImgName = Convert.ToBase64String(data);

  string encryptedEncoding = HttpUtility.UrlEncode

  (

  encryptedImgName

  );

  //将加密后的密文存放在共享数据中

  ShareData.KeyCollections.Add(encryptedImgName);

  ViewData["imgUrl"] = string.Format("{0}{1}?key={2}", path, imgName, encryptedEncoding);



  2.自定义Handler.专用于处理图片请求.此handler做这么几件事,

  1.获得图片请求的key,即上段代码中的encryptedEncoding.没有图片key,那就哪里来送回哪里去.(友好点.给个性感图片送过去..)

  2.应该所有key都经过对称算法加密,so..解密先..

  3.判断请求是否来自本站.是本站流程进4. 否则进5

  4.本站请求再做进一步筛选.查看ShareData中是否有包含此key.(ShareData是自定义的.),存在图片的key那么清除 ShareData中此key然后正确返回请求图片.不存在那么同步骤1一样送回去..(做ShareData判断是防止javascript 篡改request head信息)

  5.不是来自本站的请求.可以提供自己的策略..我这里做的是30天链接过期.(因为第一段代码中用时间刻度做加密..所以这里解密了很好判断)

  ImageHandler

+展开
-C#
  public void ProcessRequest(HttpContext context)

  {

  HttpResponse response = context.Response;

  HttpRequest request = context.Request;

  string imgKey = request.QueryString["key"];

  byte[] data = Convert.FromBase64String(imgKey);

  string decryptedKey = SymmetricEncryptionUtility

  .DecryptData

  (

  data,

  ShareData.SymmetricKeyFile

  );

  //如果没有图片密钥就返回

  if (imgKey == nullreturn;

  string imagePath = null;

  //检查请求是否来自外站

  if (request.UrlReferrer != null)

  {

  if (String.Compare(

  request.Url.Host,

  request.UrlReferrer.Host,

  true,

  CultureInfo.InvariantCulture) == 0)

  {

  if (!ShareData.KeyCollections.Contains(imgKey))

  return;

  imagePath = request.PhysicalPath;

  if (!File.Exists(imagePath))

  {

  response.StatusCode = 404;

  return;

  }

  }

  }

  else//不是本站.检查明文时间轴

  {

  long ticks;

  if (long.TryParse(decryptedKey, out ticks))

  {

  TimeSpan ts = new TimeSpan

  (

  DateTime.Now.Ticks - ticks

  );

  //如果大于一个月

  if (ts.TotalDays > 30)

  {

  //输出链接过期

  return;

  }

  }

  }

  //移除共享数据中key

  ShareData.KeyCollections.Remove(decryptedKey);

  response.ContentType = "image/"  + Path.GetExtension(imagePath).ToLower();

  response.WriteFile(imagePath);

  }


  因为是自定义Handler注意在config中注册handler节点..至于配置节不知道什么意思..自己查查.

  web.config

+展开
-XML
  <httpHandlers> <add verb="*path="*.giftype="MvcApp.Handler.ImageHandler"/>

  <add verb="GETpath="*.jpgtype="MvcApp.Handler.ImageHandler"/>

  </httpHandlers>

  对ShareData并没有做并发等处理..只是简单的实现..还望提供更多的思路.当然可以通过配置iis 禁止外站请求图片.不过这种限制太过强硬了

加支付宝好友偷能量挖...


评论(0)网络
阅读(129)喜欢(0)Asp.Net/C#/WCF