如何判断客户是从本网站网页内的链接来访问, 还是从别的网站直接访问的?

时间:2020-12-07 13:03:16
有的网站有内链接保护功能,  对于本网站的图片只能由本网站的网页点击后, 才能被访问到, 如果不是本网站内的网页点击进入的,  就会出现404错.
我试了试,主要表现是:
  先到该站网页的某一链接(  指向该站内的/xx.jpg),  右键"从新窗口打开...",
很正常, 出现该链接指向的XX.jpg.
  但是从右键复制URL地址后,  重新开一个IE窗口,  粘贴URL,  回车,  获取 xx.jpg出错404.
  仔细查看了前一网页的HTML代码,  无任何 脚本 JAVA VBScript 等.  非常正常.  
 本机未出现任何cookie.

我用我的PERL  ENV.pl获取所有参考书上所写的客户端变量,  用二种方式试试,
得出的结果都是一样..

我很惊讶,  那么这是怎么实现的? (唯一可能性是重编了socket)

请问如何实现?  或者请讲讲原理.

11 个解决方案

#1


我是用JSP和Servlet的,不过我想都应该类似。应该是建立一个Session然后再用户登陆后在Session中加入一个标志,这样在进入需要保护的页面是判断这个标志是否存在,或者用cookie来实现也行。

#2


你说的这种方法是用来保持客户端状态的. 需要登录.建立session后, 开另一个IE窗,是同样能保持状态的.
不是我说的内链接保护. 

因为我说过了前一页是标准的HTML3.0源码,里面什么也没有.并无任何调用jsp及cookie.且网站内部的HTML大多是别的用户动态编写的,不可能有任何编写的机会.

我想问:有没有底层的变量可以识别客户端的"history"?

#3


session的建立并不一定要登陆呀,那还不全在于你的意愿么,只要你在用户登陆首页时建立一个session,然后在后续的页面中进行校验不就行了么,我想他总不能连首页都不能登陆吧,限制也是限制其它页的访问,这样客户端肯定只是HTML,至于你说没有Cookie我想不大可能吧,http是无状态的协议除了用Cookie和基于Cookie的session或url带回数据或者form数据隐藏不可能靠其他的方法来实现这样的功能的吧。

#4


你讲的非常有道理,但我想应该没有session. COOKIE是肯定没有的.
因为我直接请求失败的是.jpg文件,服务器能不能在.jpg上验证session?

我做了这些:在该服务器上临时建了一个HTM,先记页面的URL,HTM后缀,该页无任何内嵌的标记.
 先断开网络,再拨号上网.清理了cookie.
马上进入该页,(而这一页根本就是刚刚我临时自建的HTM),就可以点击下一步的该页的链接图片,获得成功.查看自身机器内的cookie,未发现新的cookie.
 直接在IE里输入该图的url路径,获取失败.

我想:可能性会不会有以下可能:
  1,服务器上对任意后缀的文件都建了一个保护机制(内链接保护),有点象有些服务商的免费空间的banner条,你在你自己的html代码里不写任何代码,也会出现服务商的banner. 我映象中NT的internet服务器管理项好象有点之类的东西(好长时间没用NT),然后,在任意文件上加了一个自动的session?  但问题是.jpg上也可以验证session?

    2 ,在socket编程底部,是否有传递IE的'history'变量,即"后退"项?
   自编WEB服务器的大有人在.但我对这些底层的东西只了解了表面的东东,还不会.

    注:谢谢xexplorer. 5点

#5


请教xexplorer:
 如果一个iE窗口里获取一个HTML网页后,建立了一个session,然后在未过期之前,点击一个.jpg的缩略图,获取.jpg成功.
 回退.迅速重现了刚才HTML页面.
 在当前的窗口里输入刚才的.jpg文件URL,获取出错.
 再回退.迅速重现刚才HTML页面.
 在当前窗口再按一下刚才.jpg的缩略图,获取404错误.
 回退,重现html.
 选择其它.jpg的缩略图,获取成功.

 此时session是保持着呢,还是没保持着?

#6


刚才我在自己的机子上试了试,我先把cookie删掉,然后访问我自己机器上的server建立一个session,结果我发现我的机器上竟然也没有cookie,呵呵,奇怪吧。而且不管什么Web server我想它都不会为每一个文件连接建立一个session的,那样的话服务器早该被拖死机了。我没有研究过ie的行为,不过我想它不会用http通信以外的方式与web服务器联系的,在http数据报中不会包含history变量的,你可以看看http的报文。
GET /aaa.jpg HTTP/1.0
Connection:Keep-Alive
User-Agent:Mozilla/3.0b4gold
Host: www.yourweb.com
Accept: image/jpg ……
你看这里哪能保存history变量呢,就算是post方式的http数据报也只能以form的形式提交数据。所以socket也不能帮什么忙的。

#7


至于你说的那个session是否保持的问题我觉得很奇怪,我想是网络不通畅吧。要不你给我那个网站的地址,我去试试。

#8


你的email ?

#9


x-explorer@sohu.com

#10


大致原因我了解了,最大的可能性是服务器每次自动检查对.jpg图形的HTTP链接的头部,
可能针对 HTTP_REFERER 的.
我用perl做了一个修改自身发送http::header的东西,估计可以.
但由于我的客户端却是VB或DEPHI的
怎样改自已用Internet Transfer Control控件发出的HTTP链接的header中的 referer成了我的一个大问题.

#11


你参考一下delphi的isapi这部分,应该有这方面的资料的。

#1


我是用JSP和Servlet的,不过我想都应该类似。应该是建立一个Session然后再用户登陆后在Session中加入一个标志,这样在进入需要保护的页面是判断这个标志是否存在,或者用cookie来实现也行。

#2


你说的这种方法是用来保持客户端状态的. 需要登录.建立session后, 开另一个IE窗,是同样能保持状态的.
不是我说的内链接保护. 

因为我说过了前一页是标准的HTML3.0源码,里面什么也没有.并无任何调用jsp及cookie.且网站内部的HTML大多是别的用户动态编写的,不可能有任何编写的机会.

我想问:有没有底层的变量可以识别客户端的"history"?

#3


session的建立并不一定要登陆呀,那还不全在于你的意愿么,只要你在用户登陆首页时建立一个session,然后在后续的页面中进行校验不就行了么,我想他总不能连首页都不能登陆吧,限制也是限制其它页的访问,这样客户端肯定只是HTML,至于你说没有Cookie我想不大可能吧,http是无状态的协议除了用Cookie和基于Cookie的session或url带回数据或者form数据隐藏不可能靠其他的方法来实现这样的功能的吧。

#4


你讲的非常有道理,但我想应该没有session. COOKIE是肯定没有的.
因为我直接请求失败的是.jpg文件,服务器能不能在.jpg上验证session?

我做了这些:在该服务器上临时建了一个HTM,先记页面的URL,HTM后缀,该页无任何内嵌的标记.
 先断开网络,再拨号上网.清理了cookie.
马上进入该页,(而这一页根本就是刚刚我临时自建的HTM),就可以点击下一步的该页的链接图片,获得成功.查看自身机器内的cookie,未发现新的cookie.
 直接在IE里输入该图的url路径,获取失败.

我想:可能性会不会有以下可能:
  1,服务器上对任意后缀的文件都建了一个保护机制(内链接保护),有点象有些服务商的免费空间的banner条,你在你自己的html代码里不写任何代码,也会出现服务商的banner. 我映象中NT的internet服务器管理项好象有点之类的东西(好长时间没用NT),然后,在任意文件上加了一个自动的session?  但问题是.jpg上也可以验证session?

    2 ,在socket编程底部,是否有传递IE的'history'变量,即"后退"项?
   自编WEB服务器的大有人在.但我对这些底层的东西只了解了表面的东东,还不会.

    注:谢谢xexplorer. 5点

#5


请教xexplorer:
 如果一个iE窗口里获取一个HTML网页后,建立了一个session,然后在未过期之前,点击一个.jpg的缩略图,获取.jpg成功.
 回退.迅速重现了刚才HTML页面.
 在当前的窗口里输入刚才的.jpg文件URL,获取出错.
 再回退.迅速重现刚才HTML页面.
 在当前窗口再按一下刚才.jpg的缩略图,获取404错误.
 回退,重现html.
 选择其它.jpg的缩略图,获取成功.

 此时session是保持着呢,还是没保持着?

#6


刚才我在自己的机子上试了试,我先把cookie删掉,然后访问我自己机器上的server建立一个session,结果我发现我的机器上竟然也没有cookie,呵呵,奇怪吧。而且不管什么Web server我想它都不会为每一个文件连接建立一个session的,那样的话服务器早该被拖死机了。我没有研究过ie的行为,不过我想它不会用http通信以外的方式与web服务器联系的,在http数据报中不会包含history变量的,你可以看看http的报文。
GET /aaa.jpg HTTP/1.0
Connection:Keep-Alive
User-Agent:Mozilla/3.0b4gold
Host: www.yourweb.com
Accept: image/jpg ……
你看这里哪能保存history变量呢,就算是post方式的http数据报也只能以form的形式提交数据。所以socket也不能帮什么忙的。

#7


至于你说的那个session是否保持的问题我觉得很奇怪,我想是网络不通畅吧。要不你给我那个网站的地址,我去试试。

#8


你的email ?

#9


x-explorer@sohu.com

#10


大致原因我了解了,最大的可能性是服务器每次自动检查对.jpg图形的HTTP链接的头部,
可能针对 HTTP_REFERER 的.
我用perl做了一个修改自身发送http::header的东西,估计可以.
但由于我的客户端却是VB或DEPHI的
怎样改自已用Internet Transfer Control控件发出的HTTP链接的header中的 referer成了我的一个大问题.

#11


你参考一下delphi的isapi这部分,应该有这方面的资料的。