1.所有的image url都跟上密文.比如你在绑定页面image url时可以这么做.以下是MVC示例.其他的差不多.
ImageController
string path="/Content/";
string imgName = "girl.jpg?http://www.xvna.com";
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
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
);