UCHome可以通过设置允许某些IP地址访问,也可以禁止某些IP地址访问。
IP控制的设置可以在管理后台通过“访问IP设置”完成。
1. 设置数据的保存
IP控制的数据保存在UCHome的配置表config中,ipaccess代表允许访问的IP,ipbanned代表禁止访问的IP。可以设置多个,每个 IP以\r\n分隔,既可输入完整地址,也可只输入 IP 开头。例如:
"192.168."(不含引号) 可匹配 192.168.0.0~192.168.255.255 范围内的所有地址,留空为所有 IP 均可访问。
2. checkclose()函数
function checkclose() { global $_SGLOBAL, $_SCONFIG; // $_SCONFIG['close']:当前站点是否处于关闭状态,1代表关闭,0代表正常。 // $_SCONFIG['closereason']:当前站点关闭的原因 // $_SGLOBAL['supe_uid']:当前登陆后台的管理员ID // ckfounder():检查用户ID是否是站点创建者 // checkperm('closeignore'):用户组可以在后台设置权限是否忽略关闭信息 if($_SCONFIG['close'] && !ckfounder($_SGLOBAL['supe_uid']) && !checkperm('closeignore')) { if(empty($_SCONFIG['closereason'])) { showmessage('site_temporarily_closed'); } else { showmessage($_SCONFIG['closereason']); } } // ipaccess($_SCONFIG['ipaccess']):检查当前用户IP是否是允许访问的IP // ipbanned($_SCONFIG['ipaccess']):检查当前用户IP是否是禁止访问的IP if((!ipaccess($_SCONFIG['ipaccess']) || ipbanned($_SCONFIG['ipbanned'])) && !ckfounder($_SGLOBAL['supe_uid']) && !checkperm('closeignore')) { showmessage('ip_is_not_allowed_to_visit'); } }
3. ipaccess()和ipbanned()函数
function ipaccess($ipaccess) { return empty($ipaccess)?true:preg_match("/^(".str_replace(array("\r\n", ' '), array('|', ''), preg_quote($ipaccess, '/')).")/", getonlineip()); } function ipbanned($ipbanned) { return empty($ipbanned)?false:preg_match("/^(".str_replace(array("\r\n", ' '), array('|', ''), preg_quote($ipbanned, '/')).")/", getonlineip()); }
假设$_SCONFIG['ipbanned']有这样的设置:"10.3.1\r\n10.3.2.5",表达的意思是10.3.1.0~10.3.1.255和10.3.2.5这些地址都不能访问,ipbanned()函数中是这样实现的:
<?php $ipbanned = "10.3.1\r\n10.3.2.5"; $ip = "10.3.2.6"; $pattern = "/^(" . str_replace(array("\r\n", ' '), array('|', ''), preg_quote($ipbanned, '/')) . ")/"; echo $pattern . '<br/>'; if (preg_match($pattern, $ip)) echo 'True'; else echo 'False';
返回的结果:
/^(10\.3\.1|10\.3\.2\.5)/
False