找回密码
 立即注册

QQ登录

只需一步,快速开始

zyx723

注册会员

4

主题

13

帖子

91

积分

注册会员

积分
91
最新发帖
zyx723
注册会员   /  发表于:2019-5-23 09:10  /   查看:15828  /  回复:19
1金币
本帖最后由 zyx723 于 2019-5-23 09:11 编辑

在单位信息安全工作要求比较高,为防止信息泄露,要求在应用系统登录前先检测登陆者的IP地址,如果是合法IP地址,可以转换到用户登录界面,如果不是合法IP地址,则弹出非法IP地址,禁止登录的提示。

1、建立一个数据表:'IP白名单配置表',字段 '白名单IP',含一条记录
2、字段:'白名单IP' 为一字符串包含所有合法的IP范围,分别以“;”分割
3、检测IP过程
========================

将数据表 I'P白名单配置'表  的字段 '白名单IP'  按  ';' 分割成数组,对数据中的所有值进行遍历,符合以下5种情况之一即为合法IP:

含'*'的话:
192.*   ======    提取登录IP的第一段,如果和'192.'  一样即为合法IP     
192.168.*   ======    提取登录IP的前两段,如果和 '192.168.' 一样即为合法IP
192.168.1.*   ======    提取登录IP的前三段,如果和 '192.168.1.' 一样即为合法IP   (上面三个可以根据 . 的个数来提取IP,分割时以点结尾)
含'-'的话
192.168.1.4-10  ======  提取登录IP的前三段,如果和 '192.168.1.' 一样,将剩余部分按-分割成两个数值,如果本机IP地址的第四段介于两者之间为合法IP
完整IP
192.168.1.15  ======  直接与本机IP进行比对,两者相同为合法IP地址。

==========================

假如数据库中的字符串值为:   193.*;192.167.*;192.168.0.*;192.168.1.2-10;192.168.1.15

本机IP为
193.1.1.1
192.167.1.1
192.168.0.1
192.168.1.5
192.168.1.15  等均为合法IP

检测过程


1.获取登录系统的计算机的IP
2.将数据表 IP白名单配置表  的字段 白名单IP  按;分割成数组,对数据中的所有值进行遍历

A   如果含有*号,去掉最右侧 * 1个字符,保存为合法IP和本机IP进行比对

        检测字符串中 . 的个数,如果1个,本机IP取第1小数点前面的部分(含小数点),二者一致为合法
                               如果2个,本机IP取第2小数点前面的部分,二者一致为合法
                               如果3个,本机IP取第3小数点前面的部分,二者一致为合法

B  否则 如果含有 - 号,合法IP取第3小数点前面的部分(含小数点),最小值 = 右侧第一个小数点和 - 之间的值,最大值为 - 之后的值

   本机IP根据最右边的 . 分成两部分,如果前面部分(含小数点)和合法IP取第3小数点前面的部分(含小数点)一致,后面的值介于合法IP段中的最小值和最大值之间为合法

C   如果既不含 * 号,也不含 - 号,则按完整IP进行比对,两者完全一样为合法

最佳答案

查看完整内容

对的,是这个意思,这样比较好取值判断呢~帮您做个例子哈~

19 个回复

倒序浏览
最佳答案
最佳答案
Tracy.Liu讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2019-5-23 09:10:10
来自 9#
本帖最后由 Tracy.Liu 于 2019-5-31 18:23 编辑
zyx723 发表于 2019-5-24 15:32
我看了下,你说的意思是不是把每行都是一个合法的ip,每段的起止。
比如:
192.*转换成

对的,是这个意思,这样比较好取值判断呢~帮您做个例子哈~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
zyx723
注册会员   /  发表于:2019-5-23 09:16:53
2#


// JavaScript source code   这是活字格老师给的不太完整的JS代码,解决了带*的部分问题,跟实际需求不太一致,可以作为借鉴,请JS大神指导下
var localIP;
Forguncy.Page.bind("Loaded", function (arg1, arg2) {
    var localPage = Forguncy.Page.getPageName();
    if(localPage.indexOf("FGC") == -1){
        getLocalIP();
        Forguncy.getTableDataByOData("IP白名单配置表?$select=白名单IP",
            function(data){            
                // 获取成功的情况
                var loginIP = data[0]["白名单IP"];
                if(loginIP != "*"){
                    if(loginIP.indexOf("*") != -1){
                        //IP模糊匹配访问
                        var resIP = localIP.replace(/\d{1,3}$/,'*');
                        if(loginIP.indexOf(resIP) == -1){
                            alert("无权限登录活字格应用!");
                            window.location.href = Forguncy.Helper.SpecialPath.getBaseUrl()+"FGC_401页面";
                        }
                    }else{
                        //IP完全匹配访问
                        if(loginIP.indexOf(localIP) == -1){
                            alert("无权限登录活字格应用!");
                            window.location.href = Forguncy.Helper.SpecialPath.getBaseUrl()+"FGC_401页面";
                        }
                    }
                }
            },
            function(errorMessage){        
                // 获取失败的情况
                alert(errorMessage);
            }
        );
    }
}, "*");
function getLocalIP(){
    var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
    if (RTCPeerConnection) (function () {
        var rtc = new RTCPeerConnection({iceServers:[]});
        if (1 || window.mozRTCPeerConnection) {     
            rtc.createDataChannel('', {reliable:false});
        };
        
        rtc.onicecandidate = function (evt) {
            if (evt.candidate) grepSDP("a="+evt.candidate.candidate);
        };
        rtc.createOffer(function (offerDesc) {
            grepSDP(offerDesc.sdp);
            rtc.setLocalDescription(offerDesc);
        }, function (e) { console.warn("offer failed", e); });
               
        var addrs = Object.create(null);
        addrs["0.0.0.0"] = false;
        function updateDisplay(newAddr) {
            if (newAddr in addrs) return;
            else addrs[newAddr] = true;
            var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });
            for(var i = 0; i < displayAddrs.length; i++){
                if(displayAddrs[i].length > 16){
                    displayAddrs.splice(i, 1);
                    i--;
                }
            }
            localIP = displayAddrs[0];
        }
        
        function grepSDP(sdp) {
            var hosts = [];
            sdp.split('\r\n').forEach(function (line, index, arr) {
                if (~line.indexOf("a=candidate")) {   
                    var parts = line.split(' '),      
                    addr = parts[4],
                    type = parts[7];
                    if (type === 'host') updateDisplay(addr);
                } else if (~line.indexOf("c=")) {      
                    var parts = line.split(' '),
                    addr = parts[2];
                    updateDisplay(addr);
                }
            });
        }
    })();
    else{
        console.log("请使用主流浏览器:chrome,firefox,opera,safari");
    }
}
回复 使用道具 举报
dystar001悬赏达人认证
高级会员   /  发表于:2019-5-23 23:06:52
3#
zyx723 发表于 2019-5-23 09:16
// JavaScript source code   这是活字格老师给的不太完整的JS代码,解决了带*的部分问题,跟实 ...

有必要搞得那么复杂么?修改一下表结构,
白名单里面存的IP地址条件,分成四组,8个字段(因为每一组都可以设一个范围的),一个条件一行,
实际Ip分成四组,用循环语句来判断。
回复 使用道具 举报
谢厅讲师达人认证 悬赏达人认证 活字格认证
金牌服务用户   /  发表于:2019-5-24 09:55:26
4#
dystar001 发表于 2019-5-23 23:06
有必要搞得那么复杂么?修改一下表结构,
白名单里面存的IP地址条件,分成四组,8个字段(因为每一组都 ...

精辟
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2019-5-24 11:15:43
5#
楼上的能不能解决您的问题呢?
回复 使用道具 举报
zyx723
注册会员   /  发表于:2019-5-24 15:03:17
6#
本帖最后由 zyx723 于 2019-5-24 15:06 编辑

楼上的意思是把白名单ip分成五条记录,每条记录代表一种类型,这样不用判断直接可以进行处理。
=================
类型                    白名单ip
=================
192.*型               192.*,193.*
192.1.*型            194.1.*,194.2.*
192.1.1.*型          195.1.1.*,195.1.2.*
192.1.1.1-5型      196.1.1.4-40,196.1.2.6-50
192.168.1.1型     192.168.1.5,192.168.1.7
还是什么?没太明白楼上的意思?
回复 使用道具 举报
zyx723
注册会员   /  发表于:2019-5-24 15:05:27
7#
本帖最后由 zyx723 于 2019-5-24 15:41 编辑


回复 使用道具 举报
zyx723
注册会员   /  发表于:2019-5-24 15:32:01
8#
本帖最后由 zyx723 于 2019-5-24 15:40 编辑

我看了下,你说的意思是不是把每行都是一个合法的ip,每段的起止。
比如:
192.*转换成
192  1 1 1  192 255 255 255
192.1.* 转换成
192 1 1 1 192 1 255 255
192.1.1.*转换成
192 1 1 1 192 1 1 255
192.168.1.5-56转换成
192 168 1 5 192 168 1 56
192.168.1.55转换成
192 168 1 55 192 168 1 55
这样,然后每一个符合条件的都写成一条记录
这样判断着比较方便是吗?
关键问题:求            JS代码        
回复 使用道具 举报
dystar001悬赏达人认证
高级会员   /  发表于:2019-5-24 23:52:34
10#
zyx723 发表于 2019-5-24 15:32
我看了下,你说的意思是不是把每行都是一个合法的ip,每段的起止。
比如:
192.*转换成

每组条件都是8个列,这样计算分析方法就都一致了。
192.*,  对应的是 192,192,0,255,0,255,0,255,
192.1.*,对应的是 192,192,1,1,0,255,0,255,
192.168.1.1~10,对于的是 192,192,168,168,1,1,1,10。

然后判断活字格内置命令就可以做出来了,循环+ if 条件。

理解了么?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部