喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 17  1/2  1  2  > 
     
标题: 禁用IP的mysql+php设计  
  本主题被作者加入到他/她的 Blog 中  
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
禁用IP的mysql+php设计

安全,这是很多网页程序设计都要面临的问题。
禁用IP是安全的一部份。下面就分析下禁止IP的php+mysql的程序设计,不足之处,请大家提出意见

就来个简单的例子来说明一下。

CREATE TABLE `banned` (
  `ip_start` int(10) NOT NULL default '0',
  `ip_end` int(10) NOT NULL default '0',
) TYPE=MyISAM COMMENT='禁止IP列表';
上面是新建一个数据表,表有两个字段用来记录要禁用IP的起始。ip_tart是开始,ip_end是结束。ip_start的值要比ip_end值小或相等。范围 是0~4294967295。如果只有一个IP,那么这条记录ip_start与ip_end的字段值相同。

注意,这两个字段都是以int类型出现的,为什么呢?因为一个ip是可以转换为一个相对应的十进制数字。数字大小的对比占有很强的优势。

下例输入一个禁止的IP。127.0.0.1
INSERT INTO `banned` (`ip_start`, `ip_end`) VALUES (INET_ATON( '127.0.0.1' ),INET_ATON( '127.0.0.1' ));
如果要禁用一段IP,如192.168.1.1~192.168.255.2255
INSERT INTO `banned` (`ip_start`, `ip_end`) VALUES (INET_ATON( '192.168.1.1' ),INET_ATON( '192.168.255.255' ));

我们可以从数据表中看到,上面插入的记录的 ip_start与ip_end字段值是2130706433。因为mysql的函数INET_ATON将ip转为了数字形式。

现在,禁止一个IP,只要看一下,这个IP是不是在这个数据表里所包函的一条记录。

$ip = '127.0.0.1';
$sql = "SELECT count(*)         FROM `banned` WHERE ip_start  >=INET_ATON('$ip') and ip_end <= INET_ATON('$ip') ";
$result =  mysql_query($sql);
$banned = mysql_fetch_array($result);
echo $banned[0] ? "禁止IP" : "通行IP" ;




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-7-27 08:19 PM#1
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
fcicqbbs
注册会员
Rank: 2



UID 74804
精华 0
积分 96
帖子 110
金钱 96 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-6-10
状态 离线
[推荐阅读] 求助!如何将上传的文件名写入数据库
可惜每次都是全表扫描.

这个东西都见过,没啥新意,但也支持一下,呵呵.




doc
2006-7-27 08:21 PM#2
查看资料  访问主页  发短消息  顶部
 
sadly (sadly)
管理员
Rank: 9Rank: 9Rank: 9
管理员


UID 1
精华 4
积分 2024
帖子 2015
金钱 1537 喜悦币
威望 40
人脉 447
阅读权限 200
注册 1970-1-1
来自 北京 三元桥
状态 离线
[推荐阅读] 关于数组的问题
tips:
ip转换应采用php的ip2long函数,尽量不要用mysql的函数对数据做处理,会降低性能。
查询时先转换成一个变量,这样效率能高一点:)
   $key=sprintf("%u", ip2long($ip));
   $sql = "SELECT count(*)         FROM `banned` WHERE ip_start  >='$key'  and ip_end <= '$key' ";




以PHP在中国的繁荣发展为己任
QQ:824008 MSN:sadly@phpx.com
2006-7-28 09:45 AM#3
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  顶部
 
fcicqbbs
注册会员
Rank: 2



UID 74804
精华 0
积分 96
帖子 110
金钱 96 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-6-10
状态 离线
[推荐阅读] 请教关于类引用的include文件变量的问题
村长注意,ip2long在大于128.0.0.1后会得到你不想要的结果.是负的.



doc
2006-7-28 09:54 AM#4
查看资料  访问主页  发短消息  顶部
 
sadly (sadly)
管理员
Rank: 9Rank: 9Rank: 9
管理员


UID 1
精华 4
积分 2024
帖子 2015
金钱 1537 喜悦币
威望 40
人脉 447
阅读权限 200
注册 1970-1-1
来自 北京 三元桥
状态 离线
[推荐阅读] php怎么调用html的模版?


QUOTE:
原帖由 fcicqbbs 于 2006-7-28 09:54 AM 发表
村长注意,ip2long在大于128.0.0.1后会得到你不想要的结果.是负的.
呵呵,要sprintf的啊 sprintf("%u", ip2long($ip));




以PHP在中国的繁荣发展为己任
QQ:824008 MSN:sadly@phpx.com
2006-7-28 10:29 AM#5
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 求一复杂问题!(帮帮忙吧 )


QUOTE:
原帖由 sadly 于 2006-7-28 10:29 发表


呵呵,要sprintf的啊 sprintf("%u", ip2long($ip));
为方便大家理解,我就没做太复杂的。在php4.0X下, sprintf("%u", ip2long($ip)); 的结果与php5的结果是不同的。所以也不敢用php自带的函数。可以考虑下面几个函数

<?php
function long_2ip($long) {
   
// Valid range: 0.0.0.0 -> 255.255.255.255
   
if ($long || $long 4294967295) return false;
   
$ip "";
   for (
$i=3;$i>=0;$i--) {
       
$ip .= (int)($long pow(256,$i));
       
$long -= (int)($long pow(256,$i))*pow(256,$i);
       if (
$i>0$ip .= ".";
   }
   return 
$ip;
}

function 
ip2_long($ip){
     
$ip explode(".",$ip);
     if (!
is_numeric(join(NULL,$ip)) or count($ip) != 4) {return false;}
     else {return 
$ip[3]+256*$ip[2]+256*256*$ip[1]+256*256*256*$ip[0];}
}

function 
check_ip($ip){
    
$arr explode('.',$ip);
    if(
count($arr) == 4){
        foreach (
$arr as $value)
            if (
$value 255 or $value<or !is_numeric ($value))return false;
        return 
true;
    }
    return 
false;
}
?>




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-7-28 10:40 AM#6
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
19750609 (19750609)
中级会员
Rank: 3Rank: 3
中级会员



UID 66093
精华 0
积分 285
帖子 248
金钱 285 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-8-22
状态 离线
[推荐阅读] 招聘php软件开发工程师 网站美工设计师
用这个方法,有没有考虑过动态IP的情况。
我在上海金山,据我了解,我们这里所有的用户都是临时从电信取得一个IP,只要你断线,重新连接电信的服务器,马上客户端的IP号就变了。

象这种情况,用封杀IP的方法可取吗?

期待中!
2006-7-28 12:51 PM#7
查看资料  发短消息  顶部
 
fcicqbbs
注册会员
Rank: 2



UID 74804
精华 0
积分 96
帖子 110
金钱 96 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-6-10
状态 离线
[推荐阅读] 那位能告诉我一个简单的新闻小偷程序给我呢?
晕了,晕了....
不过注意一下总是好的...谢指正.没仔细看.




doc
2006-7-28 07:15 PM#8
查看资料  访问主页  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] [求助]Apache停止失败的问题


QUOTE:
原帖由 19750609 于 2006-7-28 12:51 发表
用这个方法,有没有考虑过动态IP的情况。
我在上海金山,据我了解,我们这里所有的用户都是临时从电信取得一个IP,只要你断线,重新连接电信的服务器,马上客户端的IP号就变了。

象这种情况,用封杀IP的方法可 ...
1、我们可以加上一个cookie,把cookie的ID读入禁用数据库。那么,只要有这个cookie的用户或IP就禁止。这就弥补了用户再次拔号不同IP的禁止。当然,如果用户禁用了cookie,这个就失效了。
2、可以封杀一段IP地址。每个地方的电信都有一段供用户拔号临时分配IP。封杀这段IP就可以了。当然,这个段IP的其它用户也都封死了。这也是不足之处。

大家可以用这个例子举一反三,可以在这个禁用表里加入其它字段,如:禁用IP加入失效时间,记录用户端$_SERVER['HTTP_USER_AGENT']与$_SERVER['HTTP_ACCEPT_LANGUAGE']的md5值等。




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-7-29 09:08 AM#9
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
fcicqbbs
注册会员
Rank: 2



UID 74804
精华 0
积分 96
帖子 110
金钱 96 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-6-10
状态 离线
[推荐阅读] mysql重要语句不能用问题?
agent重复情况太多了.language也是.
就拿偶,偶就firefox,opera混用.




doc
2006-7-29 10:24 AM#10
查看资料  访问主页  发短消息  顶部
 17  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.034453 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP