当前位置: 首页 > 架构相关 > url签名(防篡改)、网站防盗链、P3P跨域设置cookie

url签名(防篡改)、网站防盗链、P3P跨域设置cookie

这篇文章的三个tips:url签名(防篡改)、网站防盗链、P3P跨域设置cookie。是自己曾经工作中解决过的问题,周末整理,仅做记录。

url签名 

主要作用是为了防止url篡改,防止有的用户进行app反编译后获取链接猜测连接进而获取一些敏感信息。

逻辑:

方法一:生成的url中除了url的主机、路径、请求参数外,还需要一个额外的以请求参数为基础通过加密算法生成的加密签名字串sign=xxx,每次请求服务器时,服务器都会再进行一次签名判断是否与sign一致。如果不一致则拒绝请求。

方法二:url参数只有一个sign,这个sign是通过参数加密的,到服务器解密得到请求参数,继而给出数据。如解密后参数格式不正确,则拒绝请求。

根据签名字串还可以定义url的有效期

在url加密时将时间戳放入,解密时拿到时间戳与当前服务器时间戳对比,可以定义url的失效机制。如果没有失效,再次将url和拿到的时间戳进行签名,对比url传来的签名是否一直。如不一致,则拒绝请求。

网站防盗链:

原理:小明复制了你站点的一篇文章到他的站点A,文章里面有很多图片。那么当别人请求站点A的这篇文章的时候。里面的图片还是从你的站点加载,浪费自己服务器的资源、负载。这时候就需要将这些图片导入到一个404页面。

方法:

#nginx防盗链处理

location ~* ^.+\.(jpg|jpeg|gif|png|bmp|swf)$ {
    #白名单
    valid_referers *.zhbor.com zhbor.com;
    if ($invalid_referer) {
        rewrite ^/ http://static.cuihongbo.com/images/404.png;
    }
    expires 30d;
}

P3P跨域设置cookie:

说明:登录淘宝taobao.com后,我上天猫tmall.com后发现自己也是登录的。

(如果两个站的一级域名一样, 比如cui.zhbor.com/laura.zhbor.com,这样连个站点只需要一次setcookie('xxx', 'aaa', SYSTEM_TIME + 86400, '/', '.zhbor.com')就可以都设置上,如果去掉第五个参数则只设置本站点的cookie)

淘宝taobao.com是怎么做到登录后天猫tmall.com也是自动登录的。其实就是一个P3P协议,我研究过discuz的统一登录服务,也是基于P3P协议的。

原理如下:

比如在taobao.com和tmall.com下的都会有一个setcookie.php文件,文件中的内容是:

taobao.com/setcookie.php

//这个就是走p3p协议的头儿
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("name", $_GET['name'], time()+3600, "/", ".taobao.com");

tmall.com/setcookie.php

//这个就是走p3p协议的头儿
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("name", $_GET['name'], time()+3600, "/", ".tmall.com");

在某个页面输入用户名后,点击登录,这个时候会有一个正在登录的提示,这个过程会在前端页面类似这样跨域设置cookie:

<script src="http://www.taobao.com/setcookie.php?name=ferman"></script>
<script src="http://www.tmall.com/setcookie.php?name=ferman"></script>

好了,这下taobao.com和tmall.com下面都有name这个cookie了。这只是一个跨域设置cookie的原理,你可以想象一下怎么不用src的方式跨域设置,如何把跨域登录做的更合理。

tips:除了ie,其他的不用p3p也可以直接设置cookie.



转载时请以 超链接的形式 注明:转自Ferman

                  

About me