ARP联盟图文中心下载中心手机频道最近更新软件最近更新文章网络热点
您当前的位置→图文中心网站专题网站建设加密网站地址解决盗连
站内搜索:

加密网站地址解决盗连


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

参考消息:http://www.arpun.com/

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";

更多精彩,请查看本类栏目: 网站专题 - 网站建设
除非注明,ARP联盟文章来于网络,投稿原创等,转载请以链接形式标明本文地址。
本文地址:http://www.arpun.com/article/3964.html

相关文章
  • ·[图文]苹果发公开信澄清公司对于系统加密的立场
  • ·[图文]iOS9越狱不能指纹加密怎么办
  • ·[图文]【斯诺登说】外星人的讯息经过加密,我们无法发现他们
  • ·如何为无线路由器加密
  • ·HTTP使用RSA公钥加密算法加密明文
  • ·如何将DWG图纸转为加密只读格式(只能浏览,不能编辑修改)?
  • ·[图文]bioprotect指纹加密系统怎么用
  • ·[图文]免费文件加密方法解析
  • 发表评论
    栏目列表
    阅读排行
    本类最新
    网站帮助 - 广告合作 - 下载声明 - 网站地图