PR

Excel VBAコーディングの安全性とは「(3)http|sでのインターネット通信」

Excel VBAの安全性
この記事は約29分で読めます。

Excelのマクロやアドオンなどを利用する際に「これ使っても大丈夫なんだよね」と気になる事は無いでしょうか?

ではそうなると、「悪くない安全なマクロやアドオンとは?どのようなコーディンクになるのか?」という疑問が沸いてくるのですが、Microsoft ドキュメントの中を探してみても、これに答えてくれるページを見つける事はできませんでした。

そこでシリーズで「Excel VBAコーディングの安全性」について考えて行く事にしました。

三回目の今回は、TCP/IPでのインターネット通信にはいろいろと規格(プロトコル)ありますが、その中でもhttp(HyperText Transfer Protocol)やhttps(〃 Secure)によるインターネット通信を取り上げています。

http|sはご存じの通りWebサイトの閲覧やデータのダウンロードで使うわていますが、http|s以外の規格(プロトコル)で良く使われるものとしては、メールのSMTPやPOP3などやファイル転送のFTPなどがあります。

今回http|sを最初に取り上げた理由としては、やはり一番良く使われるものであり、そのためExcel VBAでは複数のやり方でhttp|s通信を実装する事ができるためです。

ただこれらをすべて取り上げるとポイントが分かり難くなってしまうので、よく使用される方法を中心にご説明をして、それ以外は簡単にまとめる事にします。

※http|s以外の規格(プロトコル)については、別途取り上げる予定です。

※動作は32bit版Excel 2016と64bit版Excel 2021の バージョン2306(ビルド 16529.20182)を使用して検証しています。

スポンサーリンク

VBAでhttp|sを使ってインターネット通信をする時のバリエーション

冒頭で「複数のやり方で実装できる」と書いたのですが、実際にどのくらいのやり方があるのか一覧表にまとめて見ました。

すべてを網羅しているとは言い切れませんがWeb上で探すと見つかるものを列挙しています。

No名前ライブラリ/
参照設定
種類機能
1WinHttp.WinHttpRequest.5.1winhttpcom.dll/
Microsoft WinHTTP Services, version 5.1
comクラスhttp|s通信
2Msxml2.ServerXMLHTTP.6.0
Msxml2.XMLHTTP.6.0
msxml6.dll/
Microsoft XML, v6.0
comクラスhttp|s通信
3URLDownloadUrlmon.dllwin32ファイル ダウンロード
4InternetExplorer.Applicationieframe.dll/
Microsoft Internet Controls
comクラスEdge IEモード操作
5WebServiceワークシート
関数
ページ読込
※セル最大文字数まで
6InternetOpen
InternetOpenUrl
InternetQueryDataAvailable
InternetReadFile
InternetCloseHandle
Wininet.dllwin32http|s通信
7InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest
HttpQueryInfo
InternetReadFile
InternetCloseHandle
Wininet.dllwin32http|s通信
表1:インターネット通信のやり方

7つほどやり方があるのですが、簡単に特徴をまとめます。

  • No1と2については今後もよく使われるであろうやり方です。それぞれ使用するCOMクラス/オブジェクト(以下COMクラスで表記)は違えど、コーディングとしては同じ形にする事ができます。
  • No3とNo6~7はwin32のAPIを使用する方法で、やり方としてはCOMクラスよりも歴史的に前のやり方になります。今後このやり方を使用するのは少なくなる認識です。
  • No4も既にサポートが終わったIEを操作するためのやり方になるので、これも使用が少なくなって行くはずです。
  • No5は、取得できるデータ量がセル最大文字数の32,767文字になるために、利用できるシーンは制限されます。

という事で、メインはCOMクラスを使用したやり方になるのですが、その他については簡単に使用法をまとめて行く事にします。

※上記以外にもコマンドラインシェル(バッチ”.bat”ファイルやPowerShellなど)を使ってインターネット通信をする事ができますが、これらにつきまして今回では無く別の回にまとめてご紹介したいと思います。

COMクラスを使用したhttp|s通信

COMクラスは、参照設定でも使用できるが、ここではCreateObjectを使用した形でご説明いたします。

「表1:インターネット通信のやり方」で3種類ほどご紹介しているのですが、その理由と「どれを使用すべきなのか?」についてMicrosoftドキュメントで調べて見ます。

COMクラスが3種類存在する理由を調べる

MIcrosoftドキュメントで調べるとつぎのような情報が入手できます。

No1のWinHTTPに関する情報

3種類のなかで唯一デフォルト日本語で表示されます。

文章に赤線を引いた箇所には次のように書かれています。

Microsoft Windows HTTP Services (WinHTTP) は、HTTP プロトコルを介して他の HTTP サーバーに要求を送信する HTTP クライアント アプリケーション プログラミング インターフェイス (API) を開発者に提供

なおこのドキュメントはづきのような階層に配置されています。

Learn/Windows/アプリ/Win32/デスクトップ テクノロジ/ネットワークとインターネット/

このことから、WinHTTPはまだWin32に属している事が分かります。

No2のMsxmlに関する情報

No2のMsxmlに関する情報は「定期的に更新は行われません」というメッセージ(下図左参照)が表示されて、デフォルト英語表記になります。
※下図のキャプチャは日本語翻訳をしています。

というのも実はドキュメントの階層構造を辿って行くと、下記のような構造になっています。

Learn/Previous Versions/Windows/Desktop/MSXML/Helper APIs for MSXML/

Helper APIs for MSXMLは下図では「MSXMLのヘルパーAPI」になりますが、この階層構造から分かるように、 このドキュメントはPrevious Versions(「以前のバージョン」)に属していることになるのです。

ただよくよく確認すると、上位階層のMSXMLについては、実はXMSML1を論じている事がわかます。

つまり、現在提供されているMSXML2ではなくMSXML1であるために「以前のバージョン」に配置されているようです。
※恐らくMSXML1とMSXML2はそれほど違いが無いために書き換えられる事がなく残されたものと推察されます。こう言う事はMicrosoft ドキュメントの中ではあるあるだと思います。

  • ServerXMLHTTP(上図左)
    • 「MSXMLのヘルパーAPI」の中の「IServerXMLHTTPRequest/ServerXMLHTTP」に属しています。
    • 文章に赤線を引いた箇所には次のように書かれています。
      • 異なる Web サーバー上のファイルまたはオブジェクト間で HTTP 接続を確立できるメソッドとプロパティを提供
      • サーバー アプリケーション向けに設計されたこの WinInet のサーバーセーフ サブセット
  • XMLHTTP(上図右)
    • 「MSXMLのヘルパーAPI」の中の「IXMLHTTPリクエスト」に属しています。
    • 文章に赤線を引いた箇所には次のように書かれています。
      • HTTP サーバーとの通信のためのクライアント側プロトコルのサポートを提供

両者の使い分けにつきましては、下記のMicorosftドキュメント「Helper API Security」で詳しく述べられていますのでご参照ください。

3種類の中で、今後も使用すべきもの

MSXMLについては、前章の英字で書かれた文章の中で次のように説明されています。(日本語に変換しています)

Microsoft XML Core Services (MSXML) は、高性能 XML ベースのアプリケーションを構築するための、W3C 準拠の XML API の包括的なセットを提供します。

これを踏まえると、Excel VBAで「XMLベースのアプリケーションを構築する」と言うのは難しいので、そうなるとWinHTTPを使用するのが無難だと言えそうです。

COMクラスWinHTTPの使用方法

VBAなどのスクリプト言語でCOMクラスWinHTTPを使用するためのイベント・メソッド・プロパティについては、下記Microsoftドキュメント「WinHttpRequest オブジェクト」のページにまとめられています。
※ただし、掲載されている「例」はJavascriptやC++になっているので読み替えが必要になます。

なおVBAで使用する上で1つ注意しなければならないのは、Sendメソッドを実行する際に、Openメソッドで指定したURLが存在していない場合は、メソッドの戻り値ではなく実行時エラーが発生するので、OnErrorイベントで判断する必要がある点です。

※ URLが正しく指定されているのであれば、OnErrorは使わなくても大丈夫です。

この事は上記の「WinHttpRequest オブジェクト」の中で次のように説明されています。

WinHttpRequest オブジェクトは、IErrorInfo インターフェイスを使用してエラー データを提供します。 説明と数値エラー値は、Microsoft Visual Basic Scripting Edition (VBScript) の Err オブジェクトと、Microsoft JScript の Error オブジェクトを使用して取得できます。

以上を踏まえると、MicrosoftとしてはCOMクラスWinHTTPをVBAでは積極的に使用して欲しくは無いと思っているのかもしれません。

ただそれだからと言って現実から目を背けるのではなく、しっかりと注意点を把握して間違った使用法ではない事が判断できるようになる事が本シリーズの目的です。

Wininet.dllの関数を使用した場合は、URLの間違いを戻り値で判定できる

先述した「表1:インターネット通信のやり方」のNo6と7に記載したWin32 APIを使用した場合では、URLが正しくない場合にエラーコードでハンドリングする事ができます。

ただNo7の場合はInternetOpen、InternetConnect、HttpOpenRequestではなく、HttpSendRequestの戻り値での判定になるためハンドリングが面倒です。

それに対してNo6の場合はInternetOpenの次のInternetOpenUrlで値が0になるので、こちらの方がハンドリングは容易です。

従ってOnErrorイベントを使わずにVBAでコーディングしたいとなると、No6の形でWininet.dllの関数を使うやり方の一択になります。

ただし詳しくは後述しますが、面倒くさいwin32 APIを使用する事はいまいまは敬遠される認識です。

COMクラスWinHTTPを使用したhttp|s通信のコーディング事例

具体的にCOMクラスWinHTTPを使用したコーディング事例をご紹介します。

今回は「合目的的に結果が得られれば良い」と言うよりも用途に合わせて呼び出せるように関数(Function)にしてパラメータ設定で動きを変えられる仕様にしています。

※なお、前述した表1-2のWinHTTP以外の2つのCOMクラスもCreateObjectの指定を変えれば実行する事はできます。

http|s通信を行う関数(Function)

コーディングでのポイントを列挙いたします。

  • WinHTTPを呼び出す関数にしているので、パラメータとしてURLと文字コードを設定しています。
    • 文字コードのパラメータを”Binary”にした時は、起動しているExcelファイルが格納されているフォルダーにURLの右端のファイル名を名前にしてデータを保存します。
    • 文字コードのパラメータを空文字(“”)にした時はResponseTextプロパティで文字コード変換をします。
      • この場合文字コードは指定できないのでデータが”UTF-8″以外の文字コードの時は文字化けします。
    • 上記以外では”UTF-8″や”Shift_JIS”などをパラメータとしてセットします。この場合、取得したデータを”UTF-8″や”Shift_JIS”といった文字コードに変換するために、独自関数(AdoStrmConv)て使用しています。
  • メソッドの戻り値と、SendメソッドのためのOn Errorステートメントでエラーハンドリングをするとともに、http|s通信でのステータスをStatusプロパティで判定しています。
    • エラーの内容は、関数の戻り値にセットして戻します。
Private Function WinHttpEx(stURL As String, stCharset As String) As String
Const S_OK As Long = 0&, S_200OK As Long = 200&
Dim obj_http As Object
Dim l_rtn As Long
Dim byt_buf() As Byte
Dim st_fileName As String
    WinHttpEx = ""
    Set obj_http = CreateObject("WinHttp.WinHttpRequest.5.1")
    l_rtn = obj_http.Open("GET", stURL, False)  'Openメソッド実行
    If l_rtn <> S_OK Then
        WinHttpEx = "オープン時:" & l_rtn & ":エラー.": Exit Function '<<<<<<<<
    End If
    On Error GoTo ErrHandler  'httpsでURLが存在しない/Time Outの場合の対応
    l_rtn = obj_http.Send  'Sendメソッド実行
    If WinHttpEx Like "*:エラー." Then Exit Function  '<<<<<<<<
    On Error GoTo 0
    If l_rtn <> S_OK Then
        WinHttpEx = "送信時:" & l_rtn & ":エラー.": Exit Function '<<<<<<<<
    End If
    If obj_http.Status = S_200OK Then  'Statusプロパティを確認
        If stCharset = "" Then
            WinHttpEx = obj_http.ResponseText  'ResponseTextプロパティで文字コードに変換
        Else
            byt_buf = obj_http.responseBody  'responseBodyメソッド実行
            If stCharset = "Binary" Then  '引数Binaryの時
                st_fileName = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\")) & _
                                    Mid(stURL, InStrRev(stURL, "/") + 1)
                Call SaveBianaryFile(st_fileName, byt_buf)
                WinHttpEx = st_fileName
            Else
                WinHttpEx = AdoStrmConv(byt_buf, stCharset)
            End If
        End If
    Else
        WinHttpEx = "ステータス:" & obj_http.Status & "-" & _
                             obj_http.StatusText & ":エラー."  'StatusTextプロパティ
    End If
    Set obj_http = Nothing
    Exit Function  '<<<<<<<<
ErrHandler:
    WinHttpEx = Err.Description & ":エラー.":    Resume Next
End Function

上記のWinHttpEx関数を実行するには呼び出すサブルーチンが必要ですので、次にサブルーチンのコーティング事例を次にご紹介いたします。

前章の関数(Function)を呼び出すサブルーチン

サブルーチンを使用する際の注意点を列挙いたします。

  • コーティング事例ではブックに新しいシートを追加して、得られた結果を書込んでいます。
  • パラメータ変数の指定の仕方はつぎのようになります。
    1. 呼び出すURLは5行目でコンスタント変数”c_URL”にセットします。
      • 間違ったURLを指定しないように注意します。
    2. 読み込んだデータをどのように処理するかは6行目のコンスタンス変数”c_Charset”に次の値をセットします。
      • UTF-8:空文字 または “UTF-8”
      • UTF-8以外の文字コード:”Shift_JIS” “ascii” など
      • バイナリーファイルに格納する:”Binary”
    3. コンスタンス変数”c_tag”に”>”をセット(この使用目的は、つぎの背景色薄水色の記述をご参照ください)

3つ目のパラメータ変数「コンスタンス変数”c_tag”」には次の理由で”>”をセットしています。

  • 呼び出すURLのHTML文書が改行コードを削除している場合、1つの塊としてデータが落ちてきてしまいます。
    • これをそのままシートのセルにセットすると、セルの最大文字数を超えてしまいますが、VBAではエラーにならず、シートには何も書き出されないので対策が必要です。
  • そこで今回は便宜的にHTMLタグの終端文字である”>”(16進表記で0x62)を使って文字列を分割をしてセルにセットしています。
    • この場合、厳密にはセルの最大文字数を超えていないか?を確認する必要はありますが、(エラーにならない事もあり)今回はその部分のコーディングは省略しています。
  • エラーが発生した時はイミディエイトウィンドウにメッセージを出力します。
Sub run_WinHttpEx()
Dim st_Ary() As String, st_result As String
Dim l_rtn As Long
Dim i As Integer
Const c_URL As String = "https://"  '実際にアクセスするアドレスをセット
Const c_Charset As String = ""
Const c_tag  As String = ">"
    st_result = WinHttpEx(c_URL, c_Charset)  '関数 呼び出し
    If st_result <> "" Then  '結果が空でなければ
        If InStr(st_result, ":エラー.") <> 0 Then
            Debug.Print st_result:  Exit Sub  '<<<<<<<<
        End If
        st_Ary = Split(st_result, vbLf)  '改行コード LF
        With Sheets.Add(after:=Sheets(Sheets.Count))  '新しいシートを追加
            .Range("A:A").NumberFormatLocal = "@"  '追加したシートA列の書式を文字列に設定
            l_rtn = UBound(st_Ary)
            If l_rtn < 1 Then  '改行コードが削除されている場合
                st_Ary = Split(st_Ary(0), c_tag)  'htmlであればタグ終端">"で区切る
                l_rtn = UBound(st_Ary)  'どんな種類のファイでも0x62(">"の文字コート)は出現するもの
                For i = 0 To UBound(st_Ary) - 1
                    .Cells(i + 1, 1).Value = st_Ary(i) & c_tag 'Splitで消去された文字を補填
                Next
            Else
                For i = 0 To UBound(st_Ary) - 1
                    .Cells(i + 1, 1).Value = st_Ary(i)
                Next
            End If
        End With
    End If
End Sub

その他のhttp|s通信

その他の方法につきましては簡単にご紹介をして行きます。

win32 APIを使用する場合

DeclareステートメントをVBAで使用するケースは少なくなってきているのではないか?と思います。

昔はやりたい事が出来ない時に使わざるを得なかった記憶ですが、今はいろいろなCOMクラスが提供されているので、面倒くさいwin32 APIは敬遠される認識です。

URLDownloadToFile Lib:Urlmon.dll

Urlmon.dllはInternet Explorerで使用するために作れらたようです。(参照先:https://www.exefiles.com/ja/dll/urlmon-dll/)

ちなみにMIcrosftドキュメントでURLDownloadToFileを調べるとInternet Explorerの階層の中に格納されています。
※ドキュメントは英語で更新日付は2016年です。

なお単純にインターネット上に公開されているファイルをダウンロードしてくのであれば、Urlmon.dllのURLDownloadToFileを使用するのが一番コーディングが少なくなります。

コーディング事例

今回も呼び出し関数の形にしていますので、呼び出し元のサブルーチンで呼び出すURLを指定します。

  • Declarerステートメントを標準モジュールの最初に定義します。
  • テキストファイルの場合、文字コードはUTF-8固定です。
  • ファイルの保存先は下記コーディングをコピペしたExcelブックの格納フォルダーになります。
Declare PtrSafe Function URLDownloadToFile Lib "Urlmon.dll" Alias "URLDownloadToFileA" ( _
   ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub run_DownloadFile()
Const c_URL As String = "https://"  '実際にアクセスするアドレスをセット
  MsgBox DownloadFileEx(c_URL)
End Sub

Private Function DownloadFileEx(stURL As String) As String
Const S_OK As Long = 0&
Dim l_rtn As Long
Dim st_fileName As String, st_fullPath As String
Const c_fileName As String = "noname.html"
    st_fileName = Mid(stURL, InStrRev(stURL, "/") + 1)
    If Trim(st_fileName) = "" Then st_fileName = c_fileName
    st_fullPath = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, Chr(92))) & st_fileName
    l_rtn = URLDownloadToFile(0, stURL, st_fullPath, 0, 0)
    If l_rtn = S_OK Then
        DownloadFileEx = st_fileName
    Else
        DownloadFileEx = "ダウンロード:" & "(" & l_rtn & ")" & Err.LastDllError & ":エラー."
    End If
End Function

Lib:Wininet.dll

次にご説明するのはWininet.dllのFuncionを使用した例になりますが、Microsoftドキュメントの「Windows Internet(英語表記)」には次のように目的が書かれています。

Microsoft Windows インターネット (WinINet) アプリケーション プログラミング インターフェイス (API) を使用すると、アプリケーションは FTP や HTTP などの標準インターネット プロトコルにアクセスできます。 使いやすくするために、WinINet はこれらのプロトコルを高レベルのインターフェイスに抽象化します。

Googleで翻訳

先述しました「表1:インターネット通信のやり方」のNo6とNo7に掲載しているDeclare Functionに定義するFunctionの種類は5種類対7個種類でNo7の方が多くなっています。

違いとしてはNo6ではInternetOpen、InternetOpenUrlの2種類の関数だけでURLとのコネクションを張れて、InternetQueryDataAvailableでデータの取得準備ができるのに対して、No7ではInternetOpen、InternetConnect、HttpOpenRequestをした後、HttpSendRequestをコールして、その後HttpQueryInfoでHTTPステータスコードを確認して初めて準備完了になるので大変です。

そういう意味ではNo7の方が手順が多いので、当初のhttp|s通信のやり方になるでは?と思います。
※段々と時間をかけて手順が少なくなる方向に進んできたはずです。

なお、これらに関しての具体的なコーディング事例は省略させていただきます。
※WinINet APIを使用したコーディング事例につきましては、今回とは別の話題でご紹介したいと思います。

ちなみにMicrosoftドキュメントでの上記のFunction群については、次の「WinINet Functions」(アップデートされているが英語表記)に一覧で記載されています。

InternetExplorer.Application

先述しました「表1:インターネット通信のやり方」のNo4に掲載しているInternet Explorerを操作してhttp|s通信をするやり方になります。

COMクラスというよりもCOMオブジェクトと言った方がしっくりと来るやり方です。

ご存じのようにInternet Explorer 11デスクトップアプリケーションのサポートは2022/6/15で終了していますが、Microsoft Edge(Chromium ベース) のIEモード(MSHTML ベース)を使用して2029年まではサポートされるようです。
※下記Microsoft Blogsのページを参照ください。

なおExecWBメソッドは実行時エラーが発生するのでOn Errorステートメントでリカバリーする必要がありますのでご注意ください。

この理由はMicrosoftドキュメント「ExecWB n\method(英語表記)」で次のように書かれています。

WebBrowserオブジェクトは、このメソッドをトップレベルのフレームに委譲します。フレームが存在しない場合はE_FAILを返します。

Googleで翻訳

つまりVBAではトップレベルのフレームは存在しないのでE_FAIL(HRESULT値)を返す事になります。


下記のコーディング事例ではパラメータで指定したURLをIEモードで開き(横800px、縦600px)、「Webページの保存」のフォルダー参照のウインドウを開いて、指定したフォルダーに拡張子は”htm”、名前はURLの一部が使われたものが自動提案されるので、保存します。

Sub run_WebBrowser()
Const c_URL As String = "https://"  '実際にアクセスするアドレスをセット
  Call WebBrowser(c_URL)
End Sub

Private Sub WebBrowser(stURL As String)
Dim obj_http As Object
Const OLECMDID_SAVEAS As Long = 4&
Const OLECMDEXECOPT_PROMPTUSER As Long = 1&
    Set obj_http = CreateObject("InternetExplorer.Application")
    With obj_http
        .Width = 800: .Height = 600: .Left = 0: .Top = 0
        .Visible = True
        .Navigate2 stURL
        Do While .Busy = False
            Application.Wait Time:=Now + TimeValue("00:00:01")
            DoEvents
        Loop
        On Error GoTo ErrHandler  'エラーになるのを強制的に継続する
        .ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER
        On Error GoTo 0
        .Quit
    End With
    Set obj_http = Nothing
    Exit Sub  '<<<<<<<<
ErrHandler:
    Err.Clear:    Resume 0
End Sub

※なおMicrosoft HTML Object Libraryを参照設定してHTMLDocumentを使用する事で、上記コーディング例よりも細かなコントロールが可能になるのですが、そのやり方につきましては「エクセルの神髄」の下記の記事をご参照いただければ幸いです。

WebService関数

VBAでセルの関数を使用してセルの最大文字数の制約がある中でわざわざhttp|s通信をする意味は無いのですが、限られた文字情報を外部から受け取りたいのであれば、出来なくは無いので見逃さないようにする必要があります。

なおhttp|s通信に問題があると実行時エラーが発生するのでOn Errorステートメントでリカバリーする必要があります。

Sub run_fnWebService()
Const c_URL As String = "https://"  '実際にアクセスするアドレスをセット
Dim str As String
  str = fnWebService(c_URL)
  Debug.Print str
End Sub

Private Function fnWebService(stURL As String) As String
Dim obj_WSfn As Object
  Set obj_WSfn = WorksheetFunction
  On Error GoTo ErrHandler  'URLが存在しない/Time Out/リダイレクトの場合の対応
  fnWebService = obj_WSfn.WebService(stURL)
  On Error GoTo 0
  Set obj_WSfn = Nothing
  Exit Function  '<<<<<<<<
ErrHandler:
  fnWebService = Err.Description & ":エラー.":   Resume Next
End Function

http|s通信のコーディングで注意しなければいけないポイント

様々なバリエーションでのhttp|s通信のコーディング事例をご紹介して来ました。

On Errorステートメントでリカバリーするケースが多いので、注目ポイントはOn Errorステートメントになるか?というと、そう言う訳ではありません。

なぜならhttp|s通信をする際に問題が生じなければOn Errorステートメントを省略する事ができるためです。

①まずはURL

一番注意しなければならないのは、「どことhttp|s通信をするか?」つまり「接続先の相手がどこなのか?」をコーディングの中から見つけ出して確認する事になります。

解読し易いコーディングにするのであれば、http|s通信自体の処理はファンクションにまとめて、そのファンクションにパラメータでURLを渡す形式にします。

ただし、裏をかくとすると、パラメータでURLを渡したように見せながら実は別の形で受け渡しをしていないか?をファンクションの中身を確認する必要はあります。

②処理サイクル

つぎに確認する必要があるのは「どのようなサイクルでhttp|s通信をするか?」になります。

単に1回たけ対象のURLからデータを読み込んでいるのか?、それともDOS攻撃のように繰返し読み込み続けるのか?は判断する必要があります。

いろいろなサイトから情報を収集する場合とか、一つのサイトのリンクを辿って階層を掘り下げる場合もあるかもしれません。

最終的には「悪意がある」コーディングであるか?を判断する事になります。

③データの利用目的

そして最後に「読み込んだデータを何に使用するのか?」を読み解く必要があります。

これも「実際にどのようにデータを使うのか?」が解り易いコーディングになっている必要があります。

できる事ならhttp|s通信はしないに越したことは無い

http|s通信をしていると、①から③で述べたようなポイントを確認する必要があり、それはそれなりに労力が必要な話になります。

そうなると、できるならhttp|s通信はしない方が労力を使わなくて済む事になります。

定期的に定数データをアップデートしなければならないような仕組みの場合は、http|s通信ではなくWebサイトに公開してダウンロードしたものを取り込む仕組みにするのも一考になります。

今回のまとめと次回の予告

今回の記事につきましては2009/1/4にHatena Blogに掲載されている下記の記事を参考にしています。

つまり14年前でもほぼほぼ今と同じようなやり方は出来ていた事になります。


DeclareステートメントでWin32 APIを使用するケースに関しては、本シリーズではあまり深く立ち入らないように致します。

その理由としてはWin32 APIに関して詳しく理解できていないといいますか、それによってできる事をカバーするとなると、シリーズとして終わりが見えない事態に陥りそうであるからです。

そういう意味では第一回での参照設定でもすべてを 掘り下げられ分けでは無く、世間一般で良く使われているものだけに対象をしぼらされていただきましたが、今回も同様に限られた範囲でのご説明に留めさせていただきます。

従ってどうしてもDeclareステートメントでWin32 APIを使用しなければならない場合は、使用目的の説明と解り易いコーディングを心掛ける必要がある認識です。

そうしなければDeclareステートメントが使われているだけで「悪意のあるプログラム」と見なされて使用対象から外されてしまうかもしれません。


次回はhttp|s以外の規格(プロトコル)で良く使われるものについてご説明する予定です。

以上最後までご一読いただき誠にありがとうございました。