ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9281|回复: 12

[转帖] 防盗链基础知识学习——Session,Cookie,jsessionid,Url重写

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-12-2 14:21 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 引子玄 于 2012-12-22 23:19 编辑

Session,Cookie,jsessionid,Url重写
在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null){
doStuffForNewbie();
//没有访问过
}else{
doStuffForReturnVisitor(); //已经访问过了
}
% >

这是很浅显易懂的道理,检测COOKIE的存在,如果存在说明已经运行过写入COOKIE的代码了,然而运行以上的代码后,无论何时结果都是执行doStuffForReturnVisitor(),通过控制面板-Internet选项-设置-察看文件却始终看不到生成的cookie文件,奇怪,代码明明没有问题,不过既然有cookie,那就显示出来看看。
cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}else{
for (int i = 0; i < cookie.length; i++){
out.println("cookie name:" + cookies.getName() + "cookie value:" +
cookie.getValue());
}
}

运行结果:
cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6

为什么会有cookie呢,大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字符串。

明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了。

通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。

      在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。


cookie和session机制之间的区别与联系
       具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.

       而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式

  session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。

  就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

  正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

  从网络服务器观点看所有HTTP请求都独立于先前请求。就是说每一个HTTP响应完全依赖于相应请求中包含的信息状态管理机制克服了HTTP的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。

  Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。

       cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

        session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:

<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>

什么是Url重写?

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中。然而,为使这生效,你需要为你的 servlet 响应部分的每个连接添加 session ID.

利用Url进行Session重写如何实现?

JSP实现
把 session ID 加到一个连接可以使用一对方法来简化:response.encodeURL() 使 URL包含 session ID,如果你需要使用重定向,可以使用 response.encodeRedirectURL ()来对 URL 进行编码。encodeURL () 及 encodeRedirectedURL () 方法首先判断 cookie是否被浏览器支持;如果支持,则参数 URL 被原样返回,session ID 将通过 cookies 来维持。
代码示例:
不使用Url重写:<a href=http://wwww.myserver.com/servelet/user;userName=awaysrain>Link</a>
使用Url重写:通过HttpServletResponse接口中的encodeURL()方法编码.
String myURL = response.encodeURL(http://wwww.myserver.com/servelet/user);
<a href= <%=myURL%> _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" >

JSTL实现
<c:url>可以为会话管理重写 URL
<a href="<c:url value='/content/sitemap.jsp'/>">View sitemap</a>


Struts实现:
struts配置文件中:设置属性redirect, contextRelative

<forward name="listArticlesForBlog"
path="/template/listArticlesForBlog.jsp"
redirect="true"
contextRelative="true"/>

最后一个比较搞的问题:
那么在浏览器允许cookie的情况下,不要求浏览器关闭cookie的情况下使用
url重写如何实现?
http://tomcat.apache.org/tomcat-5.5-doc/config/context.html
Context支持cookies参数。 设置cookies="false",强制只从url解析sessionid。

cookies
Set to true if you want cookies to be used for session identifierContext
communication if supported by the client (this is the default). Set to
false if you want to disable the use of cookies for session identifier
communication, and rely only on URL rewriting by the application.

转自:http://justsee.iteye.com/blog/831730

cookie

cookie

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-2 14:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 引子玄 于 2012-12-2 14:57 编辑

kangatang 对防盗链的介绍:

网上抄来的,供参考
一、   初级   --   经常更换音乐文件及其所在文件夹的名称。
这种方法最简单,最原始,只要发现服务器流量不正常了,就把后台打开点击更新资源地址,程序就自动修改资源名称。这样一来被盗链的地址就马上失效了。   
      缺点:由于资源够多,更新起来很占服务器资源,时间够长到后来,每更新一次几乎要用一个通宵。而且由于当时程序处理不够周密,每更新一次基本上都会出现一些错误链接。而且一更新了地址照样基本被盗链。
二、普通级   --   隐藏音乐文件的真实地址,这个方法大家都想到过吧,:)   。制作方法是通过脚本运算或者加密码来给查找真实地址制造麻烦。就拿mp3播放来说吧,我所使用的方法是这样比如play.asp   是播放器页面,在服务器运算的时候放取得真实地址,把这个地址写入session[地址]中保存,   play.asp根本不出现这是的资源地址,play.asp下载完成后立即会加载url.asp脚本文件,在url.asp中检测是否有session[地址]有就写如脚本,并且立即清除该值。没有就不作任何输出。这样处理在播放页效果比较好,但是在下载页就不这么好隐藏了,而且只要用户安装了讯雷软件,鼠标移动到播放器上真实地址力马就显示出来了。而且本人认为只要是能给客户端提供正常服务器的,基本上不可能做到隐藏。除非不提供服务。否则随便找个抓包软件一抓就出来了。
三、中量级   --   用asp.net拦截httpHandlers,该方法和拦截IIS的ISAPI插件基本上是一个原理。作为资源下载站,根本不用隐藏真实地址,就算完全暴露在外,其他站长把地址放到他的站上点击就会失效。原理是:通过链接请求的来路判断是否为盗链。如果来路不符合要求则表示该请求为盗链的,马上终止就可以了。这种方式相对前面两种方法来说防盗技术已经跨越了一个质的飞跃过程了。效果非常好。现在使用这种方式防盗的软件非常多,比如最出名的免费软件re_writer等。但是美中不足的是:如果象54star.net   这样的音乐站,要提供在线试听功能,而经检测播放器请求的来路是空的,也就是说要提供在线试听服务器,必须把来路为空也视为合法。这样一来,盗链的链接通过工具下载或者点右键-》另存为的已经其他站的播放器直接链接也是合法的。没有完全达到防盗的效果。
四、重量级   --   通过密匙验证,使用的原理和方法三很相识,一样是拦截IIS,但不同的是,拦截的不是来路,而是地址后面的一串参数---经过加密处理后的密匙。其他密匙的原理和现在的在线支付系统一样,在线支付系统后台都要设置一个密码,在你的网站上也要设置一个同样的密码,表单提交来往的过程中判断是否合法全靠它了。使用这种方法防盗链的加密防止通常是这样   密匙   =   加密函数(客户端IP   +   密码).   最后生成的地址形如:http://down.54star.net:89/cd/js-bksyjx/02.mp3?5335aaf7dec19388b7bb799dd70482e,问号前面的时候真实地址,后面那串东西就是密匙,判断是否合法就是通过判断它是否正确了。想盗本站资源的难度就形如要去破解一个未知长度,而且随时可以更改的密码是一样的。这种方法可以说在几种防盗技术中可以勘称最完美的了。而且资源服务器和网站服务器可以分开拜访。如果要提供给友情站使用,只需要把密匙告诉他即可。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-2 14:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 引子玄 于 2012-12-2 14:51 编辑

弦月大师对防盗链的一点总结:

我现在碰见的防盗,主要有以下几种方式:
(1)REFERER防盗,winhttp或xmlhttp5.0伪造下即可。
(2)COOKIE防盗,一般是session防盗,获得sessionid即可。winhttp或xmlhttp5.0版本都可以模拟。
(3)随机数网页码源,伴随POST/GET提交,有部分其实也是SESSION防盗的一种,其中ASP/ASPX的页面非常多这样的情况。留心码源即可。
(4)验证码防盗:如果是干扰符非常多的,基本也没什么希望了。简单的验证码,按键精灵有很多脚本或库可以用,或者蓝天老师/竞赛区有几个位图识别帖子可以参考。
(5)IP防盗,这个非常无敌,基本没办法,全世界,能伪造IP的人,没几个。
(6)HTML5的缓存判断防盗,也是留心下JS脚本取数就知道了。
(7)综合防盗,以上集中混搭。这个比较费神而已。。。
防盗和取数,是一个博弈的过程,还会有很多很多新的方式出现的。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-2 16:00 | 显示全部楼层
本帖最后由 引子玄 于 2012-12-2 16:10 编辑

liucqa在教程《网页采集教程第五课-如何伪造Cookie及处理Referer防盗链http://club.excelhome.net/thread-899268-1-1.html》中提示:


通常来说,如果要解决Cookie的防盗链问题,必须要在提交数据之前先获取一个有效的Cookie,因此采用两次WinHTTP调用是最常见的方式。
例如上面的代码,第一次调用winhttp获得有效Cookie,第二次调用Winhttp通过发送有效Cookie和Referer以确保提交的请求不会被网站拒绝。




大概意思是说:得先把网页的DD先搞进缓存,然后再从缓存文件中提取。

TA的精华主题

TA的得分主题

发表于 2012-12-3 10:19 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-3 11:37 | 显示全部楼层
本帖最后由 引子玄 于 2012-12-3 11:55 编辑

蓝天大师对防盗链的破解做法:
——利用IE对象法,让IE浏览器为我们自动转码编码来对付防盗链,突破网站设置的各种障碍。
我们只要模拟IE浏览器的动作就可以破障,IE对象法抓取“只要看得到,就能抓得到”,除非网页不让我们看得到,看得到我们就能用IE对象法抓得到。如果看得到却抓不下来,“那是因为IE对象抓取的技术没过关”,IE对象抓取技术过关了,是不可能出现这种情况的。

IE对象法在破解防盗链上“一枝独秀”,是其他对象法(抓取)所无可比拟的,优势尽显,独占熬头。



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-12-3 12:59 | 显示全部楼层
引子玄 发表于 2012-12-3 11:37
蓝天大师对防盗链的破解做法:
——利用IE对象法,让IE浏览器为我们自动转码编码来对付防盗链,突破网站设 ...

据我所知,"IE对象法" 不存在防盗链问题。防盗链主要是针对 "xmlhttp方法"的.

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-3 13:05 | 显示全部楼层
kangatang 发表于 2012-12-3 12:59
据我所知,"IE对象法" 不存在防盗链问题。防盗链主要是针对 "xmlhttp方法"的.

多谢,是啊,碰到解决不了的“防盗链”,就要想到用IE,突破防盗链的障碍,不然就很头疼。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-12-10 12:52 | 显示全部楼层
本帖最后由 引子玄 于 2012-12-10 13:08 编辑

cookie和session的区别?

如上文所述,session和cookie的目的相同,都是为了克服http协议无状态的缺陷,但完成的方法不同。session通过cookie,在客户端保存session id,而将用户的其他会话消息保存在服务端session对象中,与此相对的,cookie需要将所有信息都保存在客户端。因此cookie存在着一定的安全隐患,例如本地cookie中保存的用户名密码被破译,或cookie被其他网站收集(例如:1. appA主动设置域B cookie,让域B cookie获取;2. XSS,在appA上通过javascript获取document.cookie,并传递给自己的appB)。

----------------------------
如何快速抓取cookie?

登录后在IE里输入以下内容回车可以得到COOKIE
javascript:alert(' SeraWebInfo提示:\r\ncookie已经复制到剪贴版\r\n 作者:seraph');window.clipboardData.setData('text',document.cookie);
然后直接ctrl+V粘贴出来就行了

或者在IE里输入以下代码:
javascript:alert;window.clipboardData.setData('text',document.cookie);
然后直接用ctrl+V,粘贴出来的内容就是你所要抓的cookie了

TA的精华主题

TA的得分主题

发表于 2013-1-19 18:04 | 显示全部楼层
引子玄 发表于 2012-12-10 12:52
cookie和session的区别?

如上文所述,session和cookie的目的相同,都是为了克服http协议无状态的缺陷, ...

javascript:alert;window.clipboardData.setData('text',document.cookie);
今天才看到这句,有意思,收藏了。

点评

取不到HTTPONLY的COOKIE的  发表于 2013-7-26 23:19
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 17:53 , Processed in 0.042895 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表