2011-07-29

健保IC卡讀卡機ACTIVEX+JS

2019.07.01更新:請不要再用IE ONLY的解決方案了,IE已經是被微軟廢棄的瀏覽器,有用瀏覽器讀取本地IC卡的需求,可參考用Java、.NET CORE或Nodejs等語言,製作一個本機端的web server+讀卡程式,這樣也可跨平台+跨瀏覽器。

健保IC卡讀卡機ACTIVEX+JS

趁昨晚閒閒,先來個IE-ONLY的讀取介面 (懶 XD)
於是我就寫了個簡單的健保卡讀取範例(IE-ONLY),當然你的讀卡機要插健保卡:



<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body onload="ReaderCount();">
<script type="text/javascript">

function ReaderCount(){

     var NHICardReader = document.getElementById('NHICardReader');
     var ReaderSelect = document.getElementById('reader_select');
     ReaderSelect.options.length = 0;
     var firstIndex = null;
 
   for (var i=0; i<NHICardReader.ReaderCount; i++)
    {
 NHICardReader.ReaderIndex = i;
        var ReaderItem = new Option(NHICardReader.ReaderName, i);
 ReaderSelect.options.add(ReaderItem);
 
 if (firstIndex == null && NHICardReader.CardPresent && NHICardReader.Read())
 {
   firstIndex = i;
    ReaderSelect.value= firstIndex;
    ExecRead(firstIndex);
  }
     
 }

}

function ExecRead(SelIndex)
{
 var NHICardReader = document.getElementById('NHICardReader');
  var ReaderSelect = document.getElementById('reader_select');
 
 if (SelIndex == null && ReaderSelect.value != null && ReaderSelect.value >= 0){
 NHICardReader.ReaderIndex = ReaderSelect.value;
 }else if(SelIndex != null){
 NHICardReader.ReaderIndex = SelIndex;
 }else{
 return;
 } 
    
    NHICardReader.Refresh();

    var iscard = false;
    var Msg = '';
    if (NHICardReader.CardPresent && NHICardReader.Read()){ 
  iscard = true;
  Msg = '使用 ' + NHICardReader.NHI_HolderName + (NHICardReader.NHI_Sex == 'M' ? '先生':'小姐') + ' 的全民健康保險IC卡登入';
    }else if(NHICardReader.CardPresent && !NHICardReader.Read()){
    iscard = false;
  Msg = '您可能插入了錯誤的卡,或將卡片插反了。';
   }
    
  document.getElementById('nhi_cardno').value = (iscard)?NHICardReader.NHI_CardNo:'';
  document.getElementById('nhi_holdername').value = (iscard)?NHICardReader.NHI_HolderName:'';
  document.getElementById('nhi_idno').value = (iscard)?NHICardReader.NHI_IDNO:'';
  document.getElementById('nhi_birthdate').value = (iscard)?NHICardReader.NHI_BirthDate:'';
  document.getElementById('nhi_sex').value = (iscard)?NHICardReader.NHI_Sex:'';
  document.getElementById('nhi_issuedate').value = (iscard)?NHICardReader.NHI_IssueDate:'';
    
    if(Msg != '')
    alert(Msg);
}
</script>

<h1 style="text-align:center;">健保卡讀取程式 </H1>
<p style="text-align:center;">javascript sample by duckfly @2011.for IE only. 
<hr>

<center>
<p>
<object id="NHICardReader" codeBase="NHICardReaderOCX.ocx#version=0,5,0,40" 
classid="clsid:1BFA1079-2761-4FF6-8499-5D886F7D972E" width=200 align=center 
height=150></object><br><br>
<div id="reader_select_block">選擇讀卡機: 
<select id="reader_select" onchange="ExecRead(this.value);"></select>
</div>
您的卡片序號: <input id="nhi_cardno"><br>
您的姓名: <input id="nhi_holdername"> <br>
您的身分證統一編號: <input id="nhi_idno"><br>
您的出生日期: <input id="nhi_birthdate"><br>
您的性別: <input id="nhi_sex"><br>
您的卡片發卡日期: <input id="nhi_issuedate"><br><input onclick="ExecRead(reader_select.value);" value="讀取卡片" type="button"><br>
</center></body></html>


使用了一個讀健保卡的ACTIVEX控制項,免費的,真是佛心,連看PC/SC API MANUAL都免了:
http://delphi.ktop.com.tw/download.php?download=upload%2F4b802e7d17c32_PCSC_HCard_Sample.zip

原來的JS有BUG,我改了一個早上,終於算堪用了,

只是晶片讀卡都能軟體摸擬了、POST字串都能偽造了,
只插卡就能登入真的不安全,就像去提款機只要有卡片不用密碼就能提款一樣,
畢竟沒有至少雙重的資料比對,就是不會安全。

目前想到的一些增加安全性的機制:
一、人事開通插卡登入功能
二、IP範圍限制
三、不同電腦第一次登入需密碼+之後做COOKIE CHECK
四、個人自行設定隨機問題,並回答(如手機、生日、最愛的人…等)

REFERENCE:
https://www.informationsecurity.com.tw/Seminar/news_detail.aspx?aid=5369
http://203.65.114.19/HCA20/?m=download&a=display
http://ubuntu-rubyonrails.blogspot.com/2009/07/javascriptpost-request.html
http://www.scribd.com/doc/46190186/CSAPISpec30

12 則留言:

  1. 您好,請問可提供NHICardReaderOCX.ocx檔案下載嗎?謝謝!

    回覆刪除
  2. NHICardReaderOCX.ocx檔案下載:
    http://goo.gl/d4LSo5

    回覆刪除
    回覆
    1. 您好
      NHICardReaderOCX.ocx連結已失效 可否請您再提供一次 萬分感謝

      刪除
  3. 您好 想請教一下選擇讀卡機的地方無法讀取到讀卡機的話可能是什麼問題呢?謝謝您

    回覆刪除
    回覆
    1. 您好 後來發現是activex沒註冊成功,重新註冊就可以了,想另外請教一下若使用健保卡專用讀卡機時,如何讀取到該裝置呢?(使用comport1)謝謝您

      刪除
    2. 使用com port的舊型讀卡機,我就沒試過了,照理說驅動有安裝好顯示為標準PC/SC智慧卡裝置應該都能抓得到才對。

      刪除
    3. 好的 非常感謝您的回覆 我再try看看

      刪除
  4. 大大,NHICardReaderOCX.oc 無法連結,可否再提供,謝謝你..

    回覆刪除
    回覆
    1. http://delphi.ktop.com.tw/download.php?download=upload%2F4b802e7d17c32_PCSC_HCard_Sample.zip

      刪除
  5. 大大好,可以再提供NHICardReaderOCX.ocx的下載連結嗎?謝謝您 ^^

    回覆刪除
    回覆
    1. http://www.delphi-ktop-com-tw.my-hot.com/download.php?download=upload%2F4b802e7d17c32_PCSC_HCard_Sample.zip
      不過建議您不要再用IE only的解決方案了

      刪除
  6. 大大好,可以再提供NHICardReaderOCX.ocx的下載連結嗎?謝謝您

    回覆刪除