程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人能够直接跳过。javascript
因为工做须要,咱们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件。可是我发现如今市面上各类识别仪的ActiveX插件都有一个共同的问题,都是能够被仿冒伪造,好多厂家为了适应性,采用了同一个ClassID,实现一样的接口来读取信息。java
咱们的网站是要给到下线使用的,他们有些就会安装一些身份证读取软件,来经过实现一个一样接口一样ClassID的ActiveX,达到身份证读取欺诈的目的。例如clsid:10946843-7507-44FE-ACE8-2B3483D179B7程序员
<form id="form1" runat="server"> <OBJECT classid="clsid:10946843-7507-44FE-ACE8-2B3483D179B7" id="CVR_IDCard" name="CVR_IDCard" width="0" height="0" > </OBJECT> <script language="javascript" type ="text/javascript"> function Button1_onclick() { var CVR_IDCard = document.getElementById("CVR_IDCard"); var strReadResult = CVR_IDCard.ReadCard(); if(strReadResult == "0") { ClearForm(); document.all['Name'].value = CVR_IDCard.Name; document.all['Sex'].value = CVR_IDCard.Sex; document.all['Nation'].value = CVR_IDCard.Nation;
既然欺诈的ActiveX这么猖獗,而身份证识别仪必须采用ActiveX控件的方式读取外设,因此咱们须要开发本身的安全的ActiveX控件。api
PS:一开始咱们也以为从技术上是没法彻底防范的,从业务规范上的防范会更有效,甚至说安装个摄像头防止下面乱来都会有效。不过既然这里是技术博客,咱们仍是从技术层面作点探讨浏览器
既然身份证厂家提供了ActiveX(也就是OCX形式的控件),有的甚至会卖大包提供SDK包,也就是下面DLL的调用说明安全
华视电子识别仪驱动目录↓服务器
南京艺数识别仪驱动目录↓工具
若是个人ActiveX调用他们的DLL,固然技术上是简单,可是由于识别仪厂家的驱动是不一样的,并且DLL的接口也不尽相同,有的甚至不会提供接口文档,就会形成通用性不好。网站
若是个人ActiveX调用他们的ActiveX,由于你们提供给网页端都有一样的接口,因此经过ActiveX调用ActiveX会更加简单和通用。为了增长安全性,咱们的ActiveX不会经过网页进行中转,而是在内存中直接调用识别仪厂家的ActiveX。spa
var CVR_IDCard = document.getElementById("CVR_IDCard");
var strReadResult = CVR_IDCard.ReadCard();
if(strReadResult == "0")
{
document.all['Name'].value = CVR_IDCard.Name;
document.all['Sex'].value = CVR_IDCard.Sex;
document.all['Nation'].value = CVR_IDCard.Nation;
问题多了去了!!!我简单分析了BS加载识别仪数据的过程,有多个漏洞点能够想办法绕过。
1:能够经过通讯截取的,例如用Fiddler等工具拦截通讯,修改读取的信息
2:直接在浏览器通讯前用js脚本修改数据
3:修改注册表,将ActiveX控件的指向本身写的一个伪造控件,服务器就分不清是真控件读取的仍是伪造控件读取的
4:大部分识别仪厂家的ActiveX控件都是基于公安部发布的几个动态连接库,如termb.dll、sdtapi.dll等,这些dll的接口都是无校验的。写一个伪造的termb.dll替换官方的dll,就能够范围伪造的信息。
5:从dll读取usb端口应该还有文章可作,只是过于底层没有深刻研究
还没算系统钩子、反编译破解等高级方法,固然我也不是安全方面的专家,至少将一、二、3等门槛较低的问题修复也就差很少了,为了达到这个目的,咱们的作法是开发一个ActiveX来调用识别仪厂家的ActiveX控件,并做安全处理(至于中间的安全作法和防御方法,不在本系列讨论内容)。