廉颇老矣,尚能饭否

java:从技术到管理

常用链接

统计

最新评论

怎样用JSP获取当前用户的网卡IP和MAC地址?[转载]

随着Internet技术的飞速发展,企业信息系统逐步转向Intranet化,建立Web服务器作为企业信息的发布和交换平台。但是,从企业信息安全角度出发,应该建立企业信息有限度的开放机制,保证用户在规定的权限范围内的获取相应的信息。常规的安全检查方法就是设立用户身份验证机制,即在Web服务器上进行口令和IP地址过滤。可是,企业内部网络工作站的IPI地址是动态分配,没有固定的地址,而且容易被假旦。口令检查方式又增加用户记忆上的负担,容易被别人获取。由于网络工作站上的网卡地址是全世界唯一和固定不变的,可以作为安全检查的身份标识。当用户通过浏览器访问企业的Web服务器的时候,采用的网络通信HTTP协议是工作在TCP/IP协议上,是基于网络层的协议,而AC地址是在链路层上的设备才会关心的东西,所以通常情况下两台机器互访是通过广播或ARP(Address   Resolution   Protocol)协议得到相互的MAC地址后进行通信,而基于TCP/IP协议编程是很难获取对方的MAC地址的。因为路由器要准确地投递网络数据包,必须拥有网络上最完整ARP地址识别表,该表存放于路由器上的SNMP   MIB管理信息库中,所以应从这些网络设备入手获取MAC地址。根据该思路,我们采用了根据用户网络MAC地址进行身份验证的安全机制,已在我局的计算机城域网上实际运行了一年多的时间,证明是一种简易有效的安全检查手段。  
   
  一、技术思路  
   
  浏览器/服务器的模式是一种把标准输入输出定向到客户端的浏览器上,而运算过程在服务器上的一种操作,所以当某个浏览器访问相应的主页时,它的一些基本信息就会提交给服务器,这些信息包括了浏览器的名称,版本号等,同时也包括了我们所关心的客户端的IP地址,该地址存放于环境变量REMOTE   ADDR中。  
   
  当我们获得了这引会址后,下一步工作就是去询问该机器的MAC地址,这也是编程最重要的一步。要从路由器中取到ARP的信息,就要进行基于网络的SNMP(简单网络管理协议)编程。SNMP协议目前最常用的有两个版本,通常称之为v1和v2。一般情况下v2向下兼容v1版,但有时也有例外。SNMP   MIB管理信息库的存储方式是一种目录树的结构,而且它总是开始于:iso.   Org.   Dod翻译成数字就是.1.3.6,这就是我们所说的MIB(Management   Information   Base,管理信息库)的格式,而关于物理地址的MIB就是:iso.   Org.   Dod.   Internet.   Mgmt.   Mib.   At.   AtTable.   AtEnty.   AtPhysAddress(1.3.6.1.2.1.3.1.1.2)。  
   
  所以基于上述思路,该程序整个处理流程就是这样设计的,当有人访问Web服务器的主页,便激活MAC.EXE(用C语言编写),而当该程序获得了客户机的IP地址后,自动激活一个叫sn.   Class的java程序,sn.   Class便通过相应的MIB值向路由器询问此IP的MAC地址,并将结果传递给MAC.EXE,而AC.EXE将获取的这个MAC地址到自身Web服务器上的已登记合法的MAC地址库内查找,若已在MAC地址库登记的,则通过身份验证,把其相应的主页信息呈现在客户端的屏幕上;否则,验证失败,拒绝访问。  
   
  二、SNMP协议的MIB管理信息库  
   
  由于上述技术思路涉及SNMP协议及其MIB管理信息库,这里做一下简要说明。SNMP标准主要由三部人组成:简单网络管理协议(SNMP);管理信息结构(Structure   ofanagement   Information,简称SMI,RFC1155标准)和管理信息库(MIB,RFC1156、RFC1158标准)。  
   
  管理信息结构(SMI)和管理信息库(MIB)两个协议是关于管理信息的标准,它们规定了被管理的网络对象的定义格式,MIB库中都包含哪些对象以及怎样访问这些对象等等。  
   
  SMI协议规定了定义和标识MIB变量的一组原则。它规定所有的MIB变量必须用ASN.1(即抽象语法表示法I,它是一种描述数据结构的通用方法,作为OSI研究的一部分,由ISSO推出)来定义。  
   
   
   
  每个MIB变量都有一个名称用来标识。在SMI中,这个名称以对象标识符(Object   Identifier)来表示。对象标识符相互关联,共同构成一个分层结构。在这个分层结构里,一个对象的标识符是由从根出发到对象所在节点的途中所经过的一个数字标号序列组成。如图中,Internet的对象标识符就是1.3.6.1,对象标识符的命名有专门的机构负责。  
   
  在Internet节点下的mgmt节点,专门为管理信息库分配了一个子树,名为mib(1)。所有的MIB变量都在mib节点下,因此它们的名称(对象标识符)都以iso.org.dod.internet.mgmt.mib开关,数字表示是1.3.6.1.2.1。  
   
  路由器中的路由表MIB中就有网络中工作站IP地址与MAC地址的对应表。在CISCO路由器的路由表中,这种信息一般放在树型结构的{1.3.6.1.2.1.3.1.1.2.0.0.1.47}位置中,比如:一个IP地址为10.142.168.1的机器,它的MAC地址就存放在MIB表中{1.3.6.1.2.1.3.1.1.2.0.0.1.47}+{10.142.168.1}的这个位置上,知道了这个表结构后,我们就可以通过编写CGI程序来调用SNMP代理,读取MIB管理信息表中的MAC地址。  
   
  三、获取MAC地址的Java接口程序  
   
  我们可以通过好几种方法来调用SNMP代理,如用C++来调用WINT下SNMP自带的SNMP   API   FOR   WIN32的动态链接库,也可以利用SNMP   PERL来编写CGI程序完成这种功能,也可以用SNMP   Java程序来编写。SNMP   Java程序类似于SNMP   PERL程序,它是Java程序类扩展库,它提供了Java语言与SNMP代理接口的类库,使程序员通过调用这个类库很容易地操纵SNMP代理,获取网络路由表中储存的网络设备的各种信息;包括IP地址与MAC地址映射表。下面我介绍一下SNMP   Java获取MAC信息的过程。首先在程序开头加SNMP   Jva的扩展类,import   Snmp.   *;  
   
  ……  
   
  OIDStr[0]=new   String  
   
  (“.1.3.6.1.2.1.3.1.1.2.0.0.1.47.”+args[1]);定义IP地址与CAC地址的映射的位置  
   
  ……  
   
  api=new   SnmpAPI();   //产生一个SNMP代理的接口api.   Start();  
   
  snmpPDU   pdu=new   SnmpPDU(api);  
   
  pdu.   Command=apiGET_REQ_MSG;  
   
  SnmpSEssion   session=new   SnmpSession(api);  
   
  Session.   version=SnmpAPI.   SNMP   VERSION_1;  
   
  Session.   Peername=Host[I];//把路由器地址赋给线程SnmpOID   odi=new   SnmpOID(OIDStr[I],   api);   //产生一个对象标识符  
   
  If(oid.   ToValue()!=null)pdu.   AddNull(oid);  
   
  Try{Session.   Open();  
   
  Pdu=session.   SyncSend(pdu);//发出请求单元信息}catch   (SnmpException   e){}  
   
  If   (pdu=   =null){//timeout  
   
  System.   Out.   Println(“Request   timed   out   to:”+Host);  
   
  System.   Exit(1):}  
   
  SnmpVarBind   Varbind=(SnmpVarBind)  
   
  Pdu.   Variables.   FirstElement();//找到第一满足条件的信息  
   
  PduStr=varbind.   ToString();//存放找到的所需的信息  
   
  四、通过编写CGI程序实现SNMP代理功能  
   
  我们用Java编写一个sn.java程序,该程序的功能是根据给定的路由器地址(10.142.168.29)和主机IIP地址来获得相应IP地址主机的MAC地址,如:java   sn   10.142.168.29   10.142.169.1就会获得10.142.169.1的MAC地址,再通过编写一个C语言的CGI程序把Java程序执行的结果读取过来,和原有的合法MAC地址库中的数据进行比较来验证用户是否佥。首先我们可通过读取环境变量“REMOTEADDR”,该变量存放着请求用户工作站的IP地址,作为执行Java程序的一个参数,再通过C语言的sprint函数来执行Java程序sn:   Sprint(getmac,   “java   %   s   %   s”,   10.142.168.29.   remote   ipaddress);当C语言程序执行这个函数时,Java程序就被执行。并且getmac所指向的文件头就是执行结果的文件头,我们再来读取该文件,就可获取remote   ipaddress所对应的MAC地址,然后可用这个MAC地址与原有的合法MAC地址库中数据相比较,从而验证用户是否为合法用户。  
   
  五、结束语  
   
  硬件环境要求:  
   
  l   只能在局域网中(在某些特定的情况也可将其扩充到更远一些的专线网络  
   
  l   网络连接协议必须采用TCP/IP  
   
  l   网络中至少有一台路由器或智能HUB  
   
  l   至少有一台Web服务器  
   
  对系统软件需求:  
   
  l   Java程序解释器(JDK1.14以上版本)  
   
  l   GNU   C  
   
  以上两个软件均为免费软件,可以在Internet上下载。前者可在http://www.sum.com站点取到,而GCC在http://www.gnu   org/software/gcc/gcc.html下可以下载。

柳德才
13691193654
18942949207
QQ:422157370
liudecai_zan@126.com
湖北-武汉-江夏-庙山

posted on 2009-02-14 16:12 liudecai_zan@126.com 阅读(2788) 评论(1)  编辑  收藏 所属分类: 在路上

评论

# re: 怎样用JSP获取当前用户的网卡IP和MAC地址?[转载][未登录] 2010-04-21 15:42 Nick

似乎在哪里看到过啊,http://zenglingjun.blog.51cto.com/541909/197613这个地址还有代码,不仿去看看  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: