IE浏览器中如何安全地调用本地可执行程序

Wesley13
• 阅读 155

通常,浏览器中是禁止运行本地可执行程序的。但不允许浏览器运行,客观上限制了浏览器的用途和作用。要解决此问题,必须安全扩展浏览器的功能。扩充浏览器的功能,一是采用控件或插件技术,二是采用小程序技术。市场上的主流浏览器,如IR和Netscape均支持这两种技术。控件或插件多用VC、BC++、VB和Delph等语言开发。小程序一般是由,iava语言来编程的。众所周知,java语言通过“砂箱”机制禁止访问本地文件系统,更谈不上调用本地程序运行,要通过浏览器调用本地可执行程序,需使用控件或插件技术。一、安全调用本地程序的要求浏览器中调用本地程序起码要解决两个问题,一是安全性,二是位置透明性。 由于浏览器运行在客户端,安全性非常重要,如果安全性不能解决,运行在浏览器中的恶意控件轻则可能传播病毒、破坏本地文件系统,重则造成计算机系统瘫痪和信息泄密。浏览器中均有默认的安全级别,IE浏览器默认的是中级安全级别。在此安全级别下要让浏览器启动运行本地可执行程序.一早要杷榨件标记为可安全执行的。二是要对控件做数字签名。把控件标记为可安全执行的含义是要在控件中实现必需的Iknown接口外,还要实现“对象安全”接口,这样控件才能与浏览器协调一致的工作。对控件做数字签名就是采用非对称加密算法将散列函数处理后的控件散列值做加密,以保证控件的完整性和不可否认性。如果对控件不做安全标记,也不进行数字签名,要想在本地运行可执行程序,就必须降低浏览器的安全性。浏览器的安全性降低后,对于内部网络似乎问题不是很大,但要在internet上,那就给病毒、黑客人侵打开了方便之门。除非有充足的理由,一般情况下,决不可随便降低浏览器的安全性。 所谓位置透明性就是运行可执行程序与位置无关,无论其放在何处都能正常运行。位置透明性对写过控件的人并不陌生,Windows中无处不在,控件无一例外都是位置透明的。其解决办法是使用一个128位的clsid来唯一标识。clsid在HTML页面中和系统的注册表中随处可见。在使用控件时,无论是手工还是系统自动注册都是在注册表中建立clsid和控件路径的映射关系。通过这种映射关系自动解决了位置透明性。 我们也可通过注册表解决运行程序的位置透明性问题。这里的映射关系可建立成应用程序名和可运行程序路径之间的映射关系。用应用程序名来唯一地标识可执行程序,其相当于控件的cMd,用安装程序来安装可执行程序,相当于控件注册。Windows中通过安装程序安装的可执行程序,其键值均在HKEY_LOCAlMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\中,用流行的的InstallShield安装软件不难实现。调用本地可执行程序时在注册表中查找其安装路径,结合应用程序名和注册表键值中记录的执行程序路径,即可找到本地可执行程序,原理与控件的动态加载运行完全一致。二、实现机理 用支持控件的开发工具,如VC、VB等开发一个调用本地可执行程序的控件,可命名为Cyxm—LocalCallCtrl,除了实现必需的Iknown接口外,还要实现IObjectSafety接口,即前面提到的“安全对象”接口。再实现一个调用本地可执行程序的函数,如localCall(),开发完成后对控件做数字签名就可使用了。1.IObjectSafety接口该接口的核心是以下的两个函数:STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety:: GetInterfaceSafetyOptions( REFIID riid, DWORD——RPC—FAR*pdwSupportedOptions, DWORD——RPC—FAR*pdwEnabledOptions ), STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety::Set— InterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions ) 这两个函数只是用对象嵌套的方式实现的一个样例,如果用对象聚合的方式实现它,可能不是这个样子,但接口参数和函数名是不会发生变化的。对这两个函数的编码并不复杂,如果你不需要做什么,其函数体可以不用写任何代码,简单地返回就可以了。之所以写这两个函数是浏览器的要求,其加载控件时,要调用这两个函数,也就是浏览器要求你承认你写的控件是安全地。这是前面所述标记为安全脚本的技术含义。其实IE浏览器支持的接口很多,如IDispatch、IHTML-Document2、IHTMLDocument、IHTMLCollection、I-HTMLFormElement、IHTMLInputTextElement等等。扩充其功能都是通过实现它们完成的。如有些文章中介绍的通过IE浏览器窃取网页中的用户名和密码也是利用这种原理。2.数字签名 对控件做数字签名首先要制作数字证书数字证书可从数字认证中心申请得到。如果不想付费,而自己的网络又无数字认证中心,可用VC提供的工具来完成。具体做法是,用MakeCert.Exe制作数字证书,用CabArc.Exe制作压缩包,用signcode.exe进行数字签名。完成数字签名后,将控件部署到web中,即可使用。3.使用控件 如果想通过浏览器调用word.exe字处理软件,在页面中插入如下的代码和脚本程序,即可启动。不要忘了容错处理,即系统中未安装可执行程序的情况下,也要保证浏览器流畅运行。

点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
1年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。 1、使用解构获取json数据let jsonData   id: 1, status: "OK", data: ['a', 'b'] ; let  id, status, data: number   jsonData; console.log(id, status, number )
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
Stella981 Stella981
1年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解 ============================== 2016年09月02日 00:00:36 [\-牧野-](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Stella981 Stella981
1年前
Android So动态加载 优雅实现与原理分析
> 背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载. ![](https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png) 点击上方“蓝字”关注我
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为