pc软件 文章资讯 手机软件

您当前的位置→图文中心网站专题网站建设加密网站地址解决盗连
阅读排行

加密网站地址解决盗连


2009/7/6  编辑:佚名 来源:本站整理

网站防止图片等内容盗链的方法多种多样, 其中最常用的方法就是通过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";

相关文章

给Excel表格进行加密的具体方法介绍:Excel表格是我们在日常办公学习中经常会用到的,相信大家都不会陌生了吧!很多人都喜欢用Excel来存数据,对于财务人员来说,企业的工资表、财务报表等都会用Excel来记录,而这些数据又不能随意公开,那么给Excel加密就至关重要了,接下来...。

苹果iPhone7 Plus备忘录如何加密?iPhone7 Plus备忘录加密教程:  1)首先打开备忘,新建一个备忘录,输入完内容后点击右上角的分享图标。

iPhone6怎么给手机相册怎么加密?: iPhone6怎么给手机相册怎么加密?1、在手机上下载腾讯手机管家APP,下载完毕点击打开;  2、进入手机管家后,选择相册管理  3、点击加密相册并进入  4、第一次进入加密相册会要你设置一个个人密码,或者肾6用户可以通过指纹识别进入相...。

发表评论
网站帮助 - 广告合作 - 下载声明 - 网站地图