Rayman 发表于 2009-6-18 17:15:16

关于封IP的原理和方法,小发一贴~



此方法适用于1299,1310等版本,2.0的我没有见过,如果2.0中没有封ip的功能,那么此方法应该也适用于2.0的数据库。

正文
1299和1310版本的库中存在一个存储过程:PROC_INSERT_CURRENTUSER,作用是用户登陆后,将人物写入在线表CURRENTUSER,客户端传给这个存储的参数中有一个就是登陆者的IP,因此要封用户的IP,就要从这里入手。而其它存储如account_login,account_logout等没有发现有传入IP的地方,所以也只有挑这个了。
CREATE PROCEDURE PROC_INSERT_CURRENTUSER
@AccountID         varchar(50),
@CharID         varchar(50),
@ServerNo         int,
@ServerIP       varchar(50),
@ClientIP       varchar(50),
@nret smallint output
AS
INSERT INTO CURRENTUSER ( nServerNo, strServerIP, strAccountID, strCharID, strClientIP )Values(@ServerNo, @ServerIP, @AccountID, @CharID, @ClientIP )
set @nret=1
GO
这就是这个存储最原始的情况,如果我们将这个nret=0,那么用户就无法登陆了,因此方法很简单!我们接着看。

建立一个表,用于存我们封过的ip,比如叫S_IpBan,结构很简单,ip varchar(15)基本就可以以了,但是我们可以记录一下其它信息,比如封的原因,时间等,因此建表如下:
CREATE TABLE . (
        IDENTITY (1, 1) NOT NULL ,
        (15) COLLATE Chinese_PRC_CI_AS NULL ,
        (255) COLLATE Chinese_PRC_CI_AS NULL ,
        NULL
) ON
GO
接下来我们改存储PROC_INSERT_CURRENTUSER,如下:
CREATE PROCEDURE PROC_INSERT_CURRENTUSER
@AccountID         varchar(50),
@CharID         varchar(50),
@ServerNo         int,
@ServerIP       varchar(50),
@ClientIP       varchar(50),
@nret smallint output
AS
        Declare @iban int,@ip varchar(21)
        select @ip=ip from S_IpBan where ip=ltrim(rtrim(@ClientIP))
        if @@ROWCOUNT =0
        begin
                INSERT INTO CURRENTUSER ( nServerNo, strServerIP, strAccountID, strCharID, strClientIP )Values(@ServerNo, @ServerIP, @AccountID, @CharID, @ClientIP )
                set @nret=1
                return
        end
        else
        begin
                set @nret=0
                return
        end
GO
保存后,即生效,至此基本完成。

操作方法
要封一个ip,即先将该ip记入S_IpBan表,比如123.123.123.132,即可,然后该ip上的用户到了选择人物处就中断,从而达到封ip的办法。

扩展功能
有些时间,我们为了调试方便,不想让玩家登陆,但只想让自己进入,这个即把上面的原理倒过来就可以了。我们来看操作:
把自己的ip写入s_ipban表,然后把 PROC_INSERT_CURRENTUSER中的if @@ROWCOUNT =0改成if @@ROWCOUNT>0即可。


尾声
其实,封ip的方法很多牛人都能研究出来,也不是什么高深的东西,只要找到入口,自然会有办法。大家热爱骑士的,可是有很多人不愿意分享自己研究出来的东西,没办法。我记得有一句话怎么说来的?中国人喜欢单干,而西方人讲究团队,所以西方的事物发展比中国快。

有愿意讨论的,可以发邮件至[email protected]

5dekn 发表于 2009-6-18 20:44:19

不错的方法,谢谢分享

桂AG2126 发表于 2009-6-18 22:13:24

精彩。太精彩了。。。。
狂顶!!!!!!!!!!!

Rayman 发表于 2009-6-19 16:24:25

ADSL 动态的IP~~~~
m111100 发表于 2009-6-19 03:06 http://www.kofans.cn/bbs/static/image/common/back.gif

动态IP,这个没有办法的,不过上面的方法可以稍加改动,封IP段,比如121.11.*.*,不过这样很危险,本来SF就没多少人玩,你还封IP段,一封就是一个地区,呵呵。

jideaini 发表于 2009-7-10 07:18:01

sdfewrtew

duwanli2000 发表于 2009-11-27 00:06:49

狂顶,无私的楼主

leonjaykai 发表于 2009-12-31 13:48:30

謝謝樓主分享~~~
页: [1]
查看完整版本: 关于封IP的原理和方法,小发一贴~