- 2013-12-11消息称,诺基亚Normandy和Asha一样,主打低端市场,将...
- 2013-12-10雷军微博披露小米“魔方”项目
- 2013-12-1012306购票首度接入支付宝 支付时间可以快至5秒
- 2013-12-10中国移动官网显示周四接受iPhone 5s预订
- 2013-12-0912306 App研发故事:变成开放系统 社会人员助力
- 2013-10-15天猫“双十一”今年打通线上线下:实体店参与。
- 2013-10-15根据专利显示iPhone将有防摔功能。
- 2013-10-12百度或可全面收购人人网,传闻四起!
- 2013-10-07生物密码时代何时到来?尚存隐私泄露隐忧
- 2013-09-29国务院近日印发了上海自由贸易试验区总体方案,自贸区...
动态程序防采集的新方法
昨天在网上看到一个防采集软件,说采集只访问当前网页,不会访问网页的图片、JS等,今天突然想到,通过动态程序和Js访问分别记录访问者的IP,然后进行IP判断,由于采集过程不会访问JS,采集的时候只会查到用动态程序记录的IP,而不会有通过JS记录的IP,从而实现网页程序的防采集。
防采集的原理非常简单,首先放一段动态语句,把访问者的IP加入到数据库的一个表里,然后在页面底部加入一个JS,JS直接访问动态页面,将访问者的IP加入到数据库的另外一个表里。再次访问的时候,从两个表里读IP数据,然后判断时间差,如果只在第一个表里找到,在第二个表里找不到,或者时间差超过10秒,则认为是采集。
优点
1.部署简单,只要是动态语言就能很容易的实现,无需借助服务器端程序
2.杀伤力大,几乎能封杀所有的采集过程
缺点
1.第一个缺点还是杀伤力大,如果需要实际使用需要考虑一些特殊情况,以免误杀已经杀掉搜索爬虫
2.只适用于动态网页,静态页面就没法用了
流程写的比较乱,不过原理本身就不是很复杂,下面附上程序例子,懂ASP的应该很快就能看懂。
本文由方卡在线(http://www.fangka.net/)原创,转载请注明出处。如有雷同,纯属巧合!
程序例子(ASP+ACCESS):
1.建立数据库
表1:Ip1,字段Ip1_Adderss(文本),Ip1_Time(日期/时间,默认值=Now())
表2:Ip2,字段Ip2_Adderss(文本),Ip2_Time(日期/时间,默认值=Now())
2.Index.asp(仅动态代码,全部代码请见测试程序中)
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Dim Conn,Rs,Sqlstr,Ip,IpTime,IpTime2,NewUser NewUser=0 Set Conn = Server.CreateObject("Adodb.Connection") Set Rs=Server.Createobject("Adodb.RecordSet") ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("Data.mdb") Conn.Open ConnStr Ip=Request.ServerVariables("REMOTE_ADDR") Sqlstr="Select * From [Ip1] Where Ip1_Address='"&Ip&"' Order By Ip1_Id Desc" Rs.Open Sqlstr,Conn,1,3 If Rs.Eof Then NewUser=1 Application.Lock() Rs.AddNew() Rs("Ip1_Address")=Ip Rs.Update() Application.UnLock() Else IpTime=Rs("Ip1_Time") Application.Lock() Rs.AddNew() Rs("Ip1_Address")=Ip Rs.Update() Application.UnLock() End If Rs.Close If NewUser=0 Then Sqlstr="Select * From [Ip2] Where Ip2_Address='"&Ip&"' Order By Ip2_Id Desc" Rs.Open Sqlstr,Conn,1,3 If Rs.Eof Then Rs.Close Response.Write("请勿采集!") Response.End() Else IpTime2=Rs("Ip2_Time") If DateDiff("s",IpTime2,IpTime)>10 Then Rs.Close Response.Write("请勿采集!") Response.End() End If End If Rs.Close End If %> |
3.Js.asp
<% Dim Conn,Rs,Sqlstr,Ip Set Conn = Server.CreateObject("Adodb.Connection") Set Rs=Server.Createobject("Adodb.RecordSet") ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("Data.mdb") Conn.Open ConnStr Ip=Request.ServerVariables("REMOTE_ADDR") Sqlstr="Select * From [Ip2]" Rs.Open Sqlstr,Conn,1,3 Application.Lock() Rs.AddNew() Rs("Ip2_Address")=Ip Rs.Update() Application.UnLock() Rs.Close %> |
4.Get.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Response.Write(Server.HTMLEncode(GetHttpPage("http://localhost/Index.asp","GB2312"))) '============================== '函 数 名:GetHttpPage '作 用:获取页面源代码函数 '参 数:网址HttpUrl '============================== Function GetHttpPage(HttpUrl,Code) If IsNull(HttpUrl)=True Or HttpUrl="" Then GetHttpPage="A站点维护中!" Exit Function End If On Error Resume Next Dim Http Set Http=server.createobject("MSX"&"ML2.XML"&"HTTP") Http.open "GET",HttpUrl,False Http.Send() If Http.Readystate<>4 then Set Http=Nothing GetHttpPage="B站点维护中!" Exit function End if GetHttpPage=BytesToBSTR(Http.responseBody,Code) Set Http=Nothing If Err.number<>0 then Err.Clear GetHttpPage="C站点维护中!" Exit function End If End Function '============================== '函 数 名:BytesToBstr '作 用:转换编码函数 '参 数:字符串Body,编码Cset '============================== Function BytesToBstr(Body,Cset) Dim Objstream Set Objstream = Server.CreateObject("ado"&"d"&"b.st"&"re"&"am") Objstream.Type = 1 Objstream.Mode =3 Objstream.Open Objstream.Write body Objstream.Position = 0 Objstream.Type = 2 Objstream.Charset = Cset BytesToBstr = Objstream.ReadText Objstream.Close set Objstream = nothing End Function %> |
注:本站部分信息可能源于互联网分享,如有侵权,请告知,我们将及时删除!
- 用户评论
- 相关文章
-
最新评论
-
暂无关联文章
-
1
bash_profile和.bashr...
详细介绍bash_profile和.bashrc之间的区别。... -
2
awstats的安装简易指南...
介绍awstats的安装使用,使其能快速部署。 -
3
分布式监控系统gangli...
详细介绍ganglia配置过程 -
4
使用IIS+Resin来配置J...
本文介绍使用IIS+Resin来配置JSP的运行环境... -
5
MYSQL的主要参数设置(...
MYSQL的主要参数设置(优化) -
6
Linux服务器安全小技巧...
Linux 服务器安全小技巧