解决图片被盗链接的问题?

.所有的image url都跟上密文.比如你在绑定页面image url时可以这么做.以下是MVC示例.其他的差不多.


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天链接过期.(因为第一段代码中用时间刻度做加密..所以这里解密了很好判断)


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 == null) return;
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节点..至于配置节不知道什么意思..自己查查.
以上的解决方案只代表个人,并不代表官方..哈哈..当然对ShareData并没有做并发等处理..只是简单的实现..还望提供更多的思路.当然可以通过配置iis 禁止外站请求图片.不过这种限制太过强硬了..腾讯qzone里的图片好像就不能在外站引用
源码奉上.随附测试玉照一份
http://files.cnblogs.com/martinR/MvcApp.rar

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

"MvcApp.Handler.ImageHandler"/>

<add verb="GET" path="*.jpg" type="MvcApp.Handler.ImageHandler"/>

</httpHandlers>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值