所有的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里的图片好像就不能在外站引用 |