作者:郝春利

转贴请注明出处:http://blog.csdn.net/froole

网站防止图片等内容盗链的方法多种多样,其中最常用的方法就是通过HTTP访问头信息,判断访问来源。理解TCP/IP通信员里的读者都知道,由于HTTP头信息处理是在OSI模型的应用层,所以,编造一些假的HTTP头信息发送给服务器,并不需要什么特殊的技术或者工具。
下面的演示中,是利用wget命令模拟Firefox2浏览器进行HTTP基本认证的例子。依照它的访问,HTTP服务器根本就分辨不出来是火狐浏览器还是wget发送的HTTP请求,而且,访问来源也被欺骗了。

wget --http-user=登陆ID --http-password=登陆密码 --no-cache --referer=访问来源 /n --user-agent="User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"
            
通过HTTP头信息防止盗链,是一种典型的防君子不防小人的做法。

面向网络的WEB内容,都是公开的,大多数情况是不需要考虑盗链问题的。如果要限制某些内容,仅针对于某个特定群体用户的浏览,可以通过CGI进行用户认证。例如SNS、论坛以及WEB邮箱等等都具有这种功能。而访问来源只是作为访问日志的一部分,用来搜集用户活动信息,并不是系统运行所必需的内容。

综上所述,由于HTTP通信协议自身的原因,防止盗链的方法中,判断头信息是无法做到真正防盗链的。想要真正做到防止盗链只能通过以下两个途径:
1.通过CGI进行用户认证,防止无关人员对目标内容的访问:
  虽然,此方法无法防止拥有访问权限会员“盗链”,但是,对于防止不相干人员的盗链还是非常有效的。
2.动态变换访问路径:
  此种防止盗链的方法很直接,就是让盗链者得到的地址是无效的。而这个地址,只有在最先访问的用户手里才有效。以下,本文将就如何对原始链接地址加密,进行讨论。

本文所介绍的加密链接地址的方法,是一种利用XOR算法的简单的共有钥加密。
电脑技术中经常使用的加密方法有两种,一种是公开钥加密(如SSL),一种是公有钥加密(也叫秘密钥加密,如AES、BrowFish等)技术。公有钥加密就是加密方和解密方拥有共同的钥匙进行加密、解密。缺点是一旦钥匙丢失,那么,所有的加密处理都将报废,被加密内容可以被任何拥有钥匙的人得到。公开钥加密方法可以解决这一难题,但是,本文中所介绍的链接地址加密处理,全部在服务器内部进行,不涉及到泄漏加密钥匙的问题,而且,加密钥匙随着访问不同而不规则改变,也不存在泄漏解码钥匙的问题,所以将采用更简单的共有钥加密的方法。
链接地址加密原理如下:
1.当新的session被创建时,在session内乱数生成一个共有加密钥匙。
2.图片显示连接时,服务器端CGI自动对诸如内容地址、数据库中的内容ID等进行加密,生成加密后的链接地址。
3.访问加密后链接地址,服务器提取session中的加密钥匙,解密加密内容,返回请求内容。

为什么使用XOR算法:
比如一些图片网站,如果对URL进行加密,若采用复杂的加密算法,势必会增加服务器的负担。
考虑到性能方面,笔者使用了XOR算法。虽然此算法容易被破解,但是,加密钥匙的生存时间短暂,仍旧可以保持较高的安全性。
以下分别是使用了Java语言和PHP语言的加密代码,谨供参考。

Java代码:

import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class XorTest { public static void main(String[] args) throws UnsupportedEncodingException { //String value = "肉、蔬菜和水果"; //String key = "蔬菜和水果"; String value = "http://blog.csdn.net/froole/archive/2009/05/13/4176111.aspx"; String key = "key"; // 加密前输出 print("加密前", value); // 加密处理 byte[] byteEncodeArray = encode(value.getBytes(), key); value = new String(byteEncodeArray); // 加密后输出 print("加密后", value); // URL转换处理 String encode = URLEncoder.encode(value, "UTF-8"); print("转换URL", encode); String dencode = URLDecoder.decode(encode, "UTF-8"); print("从URL回复", dencode); value = dencode; // 解密 byte[] byteDecodeArray = decode(value.getBytes(), key); value = new String(byteDecodeArray); // 解密后输出 print("解密", value); } /** * 加密处理 * @param src * @param key * @return */ private static byte[] encode(byte[] src, String key) { byte[] byteKeyArray = new byte[0]; byte[] byteEncArray = new byte[src.length]; // 转换加密钥匙的循环处理 while(byteKeyArray.length < src.length) { byteKeyArray = (new String(byteKeyArray) + key).getBytes(); } // 转换 for (int i = 0; i < src.length; i++) { byteEncArray[i] = (byte)(src[i]^byteKeyArray[i]); } return byteEncArray; } /** * 解密 * @param src * @param key * @return */ private static byte[] decode(byte[] src, String key) { return encode(src, key); } /** * 转换成16进制文字 * @param value * @return */ private static String getDump16(byte[] value) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < value.length; i++) { String hex = Integer.toHexString((int)value[i] & 255); // 添补前4位 hex = "0000" + hex; hex = hex.substring(hex.length() - 4, hex.length()); // 添加空白并且每10位变行(空白区切り、10桁ずつ改行) buf.append(hex + (i % 10 == 9?System.getProperty("line.separator"):" ")); } return buf.toString().trim(); } private static void print(String title, String value) { System.out.println("【 " + title + " 】"); System.out.println("-----------------------------"); System.out.println(value); System.out.println(getDump16(value.getBytes())); System.out.println(); System.out.println(); } }

PHP代码:

// XOR encrypt/descript function xor_encrypt($plain,$key) { $seed=str_repeat($key,strlen($plain)); return bin2hex($plain^$seed); } function xor_decrypt($enc,$key) { $seed=str_repeat($key,strlen($enc)); return pack("H*",$enc)^$seed; } // 测试代码 $key='v'; $enc=xor_encrypt("http://blog.csdn.net/froole/archive/2009/05/13/4176111.aspx",$key); echo "enc:[".$enc."]/n"; echo "Org:[".xor_decrypt($enc,$key)."]/n";

<script type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
转贴请注明出处:http://blog.csdn.net/froole

加密网站地址——从根本解决盗连相关推荐

  1. HTTPS加密网站,地址重写配置

    密钥算法 对称加密 (加密解密为同一把钥匙)AES\DES 非对称加密(加密和解密不是同一把钥匙)RSA\DSA 生成密钥 SSL加密网站的核心技术是非对称生成密钥(公钥.私钥.证书) Nginx默认 ...

  2. outlook你的邮件服务器证书无效,Outlook添加网易邮箱账号提示服务器的加密连接不可用的解决方法...

    Outlook添加网易邮箱账号提示"服务器的加密连接不可用"的解决方法 发布日期:2018-12-10 outlook邮件服务器的加密连接不可用该怎么办?outlook邮箱经常添加 ...

  3. 借助nat123软件快速发布网站做网站服务,解决80端口被屏蔽被封,nat123软件原理分析

    概述 nat123软件主要是为没有公网IP或80端口被屏蔽被封的做网站用户而开放自由的平台软件. 使用nat123,可以在内网一步发布网站,做网站服务: 使用nat123,可以解决80端口被屏蔽被封的 ...

  4. 利用nat123端口映射快速发布网站做网站服务,解决80端口映射被屏蔽被封问题,及nat123端口映射分析

    nat123端口映射是基于NAT端口映射原理的应用,提供80端口为用户解决网站80端口被屏蔽被封的问题,提供非80自定义端口直连内外网应用. 内网发布网站做网站服务,80端口被屏蔽被封,外网访问内网L ...

  5. 网站SEO实践之 - 解决网站不收录的必备思路

    网站SEO实践之 - 解决网站不收录的必备思路 网站不收录可谓说是老生常谈了,太多SEO从业者有遇到这样的问题而无从下手,导致苦恼万分.我们解决网站不收录的问题前,应该思考一个问题:"让网站 ...

  6. 微信小程序——获取视频的URL地址【已解决】

    微信小程序--获取视频的URL地址[已解决] 如何获取音乐MV的URL地址 虾米音乐 试了很多音乐网站发现"虾米音乐"的MV的URL地址是可以获取的,并且在微信小程序播放视频的时候 ...

  7. 网站降权根服务器有关系吗,实例讲述更换服务器后导致网站降权的解决方法

    8元一个月的服务器已经用了小半年了,实在经不住现在的流量冲击.因服务器问题,用户打开我的网站经常出现502错误,无奈只有更换服务器,由于服务器更换时没有处理好,导致网站被降权了.接下来的SEO干货来了 ...

  8. 连接远程服务器CredSSP加密Oracle修正报错解决办法

    连接远程服务器CredSSP加密Oracle修正报错解决办法: 打开注册表,快捷输入 "regedit"(类似找命令提示符 输入 cmd 一样)找文件夹 路径:HKLM(缩写)\S ...

  9. iframe 内嵌第三方网站 cookie 失效,解决办法

    iframe 内嵌第三方网站 cookie 失效,解决办法 网站iframe内嵌第三方带登录页的网站时,在ie和火狐和部分谷歌浏览器是可以的,但是在升级版的谷歌浏览器中是无法访问的 问题是谷歌浏览器在 ...

最新文章

  1. LeetCode 295. 数据流的中位数(大小堆)
  2. HTML+CSS制作炫彩的数字时钟
  3. 使用tcgetattr函数与tcsetattr函数控制终端-转
  4. MyBatis运行动态sql及存储过程
  5. 2019寒假作业一:PTA7-1 打印沙漏
  6. wow模型修改器_《魔兽世界》魔兽世界模型修改器攻略
  7. scheme 微博_可用App URL Schemes
  8. 太赞了!有人把机器学习的数学基础整理成了专辑(pdf下载)
  9. 天池学习赛:保险反欺诈预测(附代码)
  10. Android涂鸦简单制作
  11. 数字信号处理学习笔记[1] 离散信号 奇异信号 抽样定理
  12. 《地球概论》(第3版)笔记 第三章 地球的运动
  13. iOS 逆向编程(三)实操越狱详细流程
  14. SQL Server - sql 空间数据
  15. 成都男子因女司机别车将其暴打 同款行车记录仪获热销
  16. suds对接web service
  17. STM32F103超声波HCSR04模块串口输出距离(附代码)
  18. Java面试——缓存
  19. Opencv2.4.9源码分析——SURF
  20. itext7生成pdf教程

热门文章

  1. 3Com公司不打算与华为共享敏感技术
  2. Linux(centos7)基础操作
  3. Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  4. iOS三句话实现文本转语音:AVSpeechSynthesizer
  5. php特殊表情符号拦截
  6. Cocos2d-x 游戏中子弹的设计 (一)
  7. 真正可用的使用T5577卡复制4100卡_ID卡复制
  8. PRODUCT_CHARACTERISTICS 详解
  9. learning ddr Electrical Characteristics and AC Timing
  10. ​食品领域排名靠前的品牌咨询公司塔望/华与华等服务优势对比​