| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- <?php
- namespace common\libs;
- use Yii;
- use yii\base\Component;
- use yii\web\BadRequestHttpException;
- use yii\web\Application;
- use MaxMind\Db\Reader;
- use MaxMind\Db\InvalidDatabaseException;
- use MaxMind\Db\AddressNotFoundException;
- use common\helpers\LoggerTool;
- class IpFilter
- {
- /**
- * @throws BadRequestHttpException
- * @return bool
- */
- public function checkIp($source, $isLogin = false): bool
- {
- $request = Yii::$app->request;
- $getParams = Yii::$app->request->get();
- $postParams = Yii::$app->request->post();
- $ip = $_SERVER['REMOTE_ADDR']; // 获取用户 IP 地址
- //如果IP不在指定范围内
- if (!self::checkIpInAllowRange($ip)) {
- $logPreix = $isLogin ? 'nc_ip_filter_login' : 'nc_ip_filter_other';
- $getLog = sprintf('%s_%s: remote_ip%s: url(%s): param%s', $source, $logPreix, $ip, $request->getAbsoluteUrl(), (is_array($getParams) ? json_encode($getParams) : $getParams));
- $postLog = sprintf('%s_%s: remote_ip%s: url(%s): param%s', $source, $logPreix, $ip, $request->getAbsoluteUrl(), (is_array($postParams) ? json_encode($postParams) : $postParams));
- LoggerTool::error($getLog);
- LoggerTool::error($postLog);
- return false;
- }
- return true;
- }
- /**
- * 判断IP是否在指定范围内
- * @throws AddressNotFoundException
- * @throws InvalidDatabaseException
- */
- public static function checkIpInAllowRange($ip): bool
- {
- // 是否有效的IP
- if (!filter_var($ip, FILTER_VALIDATE_IP)) {
- return false;
- }
- // 开放跳板机IP,后台快速登录使用
- if (in_array($ip, ['8.219.172.88'])) {
- return true;
- }
- // 替换为 GeoLite2 数据库文件的实际路径
- $dbPath = \Yii::getAlias('@common/runtime/geoLite//GeoLite2-Country.mmdb');
- // 初始化 MaxMind 数据库读取器
- $reader = new \GeoIp2\Database\Reader($dbPath);
- // 查询 IP 地址的地理位置
- $record = $reader->country($ip);
- // 返回国家名称
- $countryName = $record->country->name;
- if (!in_array($countryName, ['China', 'Malaysia'])) {
- return false;
- }
- return true;
- }
- }
|