php中如何实现IP地址的限制访问问题 先将你的允许访问ip范围写出来。如果不知道,就要到网上找一个ip表看看 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 单个 IP:if ( $REMOTE_ADDR == '12.34.56.78' ){//允许访问}如果是一组 IP,就要看这些 IP 的范围及是否连续了连续的 IP 好办一些,不连续的 IP 就得挨个比较,影响速度 SSH(Secure Shell)安装SSH的站点可以用tcp_wrappers来限制哪些IP地址可以通过ssh来访问自己。比如,在/etc/hosts.allow中加入sshd,sshd2: 211.86.48.3那么只有211.8.48.3可以通过ssh来访问该主机。 有一个笨办法:先把允许的ip地址放到一个文件里,再用alexxing(赤铸)的方法认证一下就可以了 可以用截取函数截取一段有效ip(即允许访问的ip) blackspider和_Shakespeare(网络骑士) 都是一种方法,不过IIS好像可以添加想屏蔽掉的IP呀 对,Win2000Server的IIS就有IP地址及域名过滤功能! 呵呵,如果用iis还不如不限制ip好呢,大家觉得呢? alexxing(赤铸)的方法用来比较连续的ip地址,可以这样用吗:假设我只允许ip地址在202.112.95.1到202.112.96.254之间的机子访问我的网站,语句:if ( $REMOTE_ADDR >= '202.112.95.1' && $REMOTE_ADDR <= '202.112.96.254'){//允许访问}这样可以实现吗?还有,如果我限制的ip地址不是这样连续的,而是把这些离散的ip地址用一个记事本文件存下来,这种限制语句怎么写呢? 看看我的一段源程序:<% if($GLOBALS["CanMaskIp"]==1) //封杀IP地址 { $strSQL="SELECT count(*) FROM MaskIp WHERE '".$GLOBALS["strVisitedIp"]."' BETWEEN SrcIpAddr AND DesIpAddr"; $tmpMaskIp=mysql_fetch_row(mysql_query($strSQL,$GLOBALS["hDatabase"])); if($tmpMaskIp[0]>0) { echo "<html>\n"; echo "<head>\n"; echo "<title>".$GLOBALS["WindowTitle"]."</title>\n"; echo "</head>\n"; echo "<body>\n"; echo "<p> </p>\n"; echo "<p> </p>\n"; echo "<p> </p>\n"; echo "<p> </p>\n"; echo "<p><center><font color=#FF00FF size=5>嘿嘿,你的IP地址被管理员禁止了哦!!<br>\n"; echo "<hr width=80% color=#CC00CC>\n"; echo "想想你自已是不是干了什么哈?!\n"; echo "</font></center></p>\n"; echo "</body>\n"; echo "</html>"; mysql_close($GLOBALS["hDatabase"]); exit(); } unset($tmpMaskIp); }%>要求建立如下表:CREATE TABLE MaskIp ( SrcIpAddr varchar(16) NOT NULL default '', DesIpAddr varchar(16) NOT NULL default '', PRIMARY KEY (SrcIpAddr)) TYPE=MyISAM COMMENT='记录封杀IP地址'; lisuosa(李点) 的方法好像不行吧.应该截成一段一段的来比较才算比较准确吧.呵. <?function chkip($client_ip,$network_number,$ip_mask){preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$client_ip,$ipsplit);preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$ip_mask,$ipsplit1);preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$network_number,$ipsplit2);if (((integer)$ipsplit[1]&$ipsplit1[1])==$ipsplit2[1]) if (((integer)$ipsplit[2]&$ipsplit1[2])==$ipsplit2[2]) if (((integer)$ipsplit[3]&$ipsplit1[3])==$ipsplit2[3]) if (((integer)$ipsplit[4]&$ipsplit1[4])==$ipsplit2[4]) return true;return false;}?>函数参数一个是客户端ip,后面是使用网段比较的方式,将ip地址与掩码做与运算,结果与网段值相同,则在该网段内,返回true。对于楼主使用的例子,其调用如下chkip($REMOTE_ADDR,"202.112.96.0","255.255.255.0")把禁止列表读到内存中然后一个个比较…… PHP老群邀请你加入 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。 访问的时候,出现文件夹丢失现象!请高手指点 二级域名问题 怎么在php里调用linux的命令 关于mysql查询url的问题 一位网友送的空间和域名,开了一个论坛,速度飞快。特此感谢。也为里面的PHP版做个广告。 session_id 存在cookie的问题 急,50分求解读取数据库的问题 我做错了什么?我的phpmyadmin总说”数据库中没有数据表“ 左面明明有表. mysql和sqlserver到底谁的速度快? 关于点击出现的问题?
{
//允许访问
}如果是一组 IP,就要看这些 IP 的范围及是否连续了
连续的 IP 好办一些,不连续的 IP 就得挨个比较,影响速度
安装SSH的站点可以用tcp_wrappers来限制哪些IP地址可以通过ssh来访问自己。比如,在/etc/hosts.allow中加入
sshd,sshd2: 211.86.48.3
那么只有211.8.48.3可以通过ssh来访问该主机。
先把允许的ip地址放到一个文件里,再用alexxing(赤铸)的方法认证一下就可以了
if ( $REMOTE_ADDR >= '202.112.95.1' && $REMOTE_ADDR <= '202.112.96.254')
{
//允许访问
}这样可以实现吗?
还有,如果我限制的ip地址不是这样连续的,而是把这些离散的ip地址用一个记事本文件存下来,这种限制语句怎么写呢?
<%
if($GLOBALS["CanMaskIp"]==1) //封杀IP地址
{
$strSQL="SELECT count(*) FROM MaskIp WHERE '".$GLOBALS["strVisitedIp"]."' BETWEEN SrcIpAddr AND DesIpAddr";
$tmpMaskIp=mysql_fetch_row(mysql_query($strSQL,$GLOBALS["hDatabase"]));
if($tmpMaskIp[0]>0)
{
echo "<html>\n";
echo "<head>\n";
echo "<title>".$GLOBALS["WindowTitle"]."</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<p> </p>\n";
echo "<p> </p>\n";
echo "<p> </p>\n";
echo "<p> </p>\n";
echo "<p><center><font color=#FF00FF size=5>嘿嘿,你的IP地址被管理员禁止了哦!!<br>\n";
echo "<hr width=80% color=#CC00CC>\n";
echo "想想你自已是不是干了什么哈?!\n";
echo "</font></center></p>\n";
echo "</body>\n";
echo "</html>";
mysql_close($GLOBALS["hDatabase"]);
exit();
}
unset($tmpMaskIp);
}
%>
要求建立如下表:
CREATE TABLE MaskIp (
SrcIpAddr varchar(16) NOT NULL default '',
DesIpAddr varchar(16) NOT NULL default '',
PRIMARY KEY (SrcIpAddr)
) TYPE=MyISAM COMMENT='记录封杀IP地址';
的方法好像不行吧.应该截成一段一段的来比较才算比较准确吧.呵.
function chkip($client_ip,$network_number,$ip_mask)
{
preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$client_ip,$ipsplit);
preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$ip_mask,$ipsplit1);
preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/",$network_number,$ipsplit2);
if (((integer)$ipsplit[1]&$ipsplit1[1])==$ipsplit2[1])
if (((integer)$ipsplit[2]&$ipsplit1[2])==$ipsplit2[2])
if (((integer)$ipsplit[3]&$ipsplit1[3])==$ipsplit2[3])
if (((integer)$ipsplit[4]&$ipsplit1[4])==$ipsplit2[4])
return true;
return false;
}
?>
函数参数一个是客户端ip,后面是使用网段比较的方式,
将ip地址与掩码做与运算,结果与网段值相同,则在该网段内,返回true。
对于楼主使用的例子,其调用如下
chkip($REMOTE_ADDR,"202.112.96.0","255.255.255.0")
把禁止列表读到内存中然后一个个比较……