欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp动态页面防采集的新方法

程序员文章站 2024-02-03 11:46:34
昨天在网上看到一个防采集软件,说采集只访问当前网页,不会访问网页的图片、js等,今天突然想到,通过动态程序和js访问分别记录访问者的ip,然后进行ip判断,由于采集过程不会...

昨天在网上看到一个防采集软件,说采集只访问当前网页,不会访问网页的图片、js等,今天突然想到,通过动态程序和js访问分别记录访问者的ip,然后进行ip判断,由于采集过程不会访问js,采集的时候只会查到用动态程序记录的ip,而不会有通过js记录的ip,从而实现网页程序的防采集。
防采集的原理非常简单,首先放一段动态语句,把访问者的ip加入到数据库的一个表里,然后在页面底部加入一个js,js直接访问动态页面,将访问者的ip加入到数据库的另外一个表里。再次访问的时候,从两个表里读ip数据,然后判断时间差,如果只在第一个表里找到,在第二个表里找不到,或者时间差超过10秒,则认为是采集。
优点
1.部署简单,只要是动态语言就能很容易的实现,无需借助服务器端程序
2.杀伤力大,几乎能封杀所有的采集过程
缺点
1.第一个缺点还是杀伤力大,如果需要实际使用需要考虑一些特殊情况,以免误杀已经杀掉搜索爬虫
2.只适用于动态网页,静态页面就没法用了
流程写的比较乱,不过原理本身就不是很复杂,下面附上程序例子,懂asp的应该很快就能看懂。
程序例子(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
%>

本文由方卡在线原创,转载请注明出处。如有雷同,纯属巧合!