icat4json 公開

no extension

IPA が提供する “icat for JSON” にアクセスする Go 言語用のパッケージを公開した。

以下のような感じで使える。

package main

import (
    "fmt"
    "log"

    "github.com/spiegel-im-spiegel/icat4json"
)

func main() {
    json, err := icat4json.Get(icat4json.ToolICATW)
    if err != nil {
        log.Fatal(err)
    }
    data, err := json.Decode()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Title: %v\n", data.Title)
    fmt.Printf("  URL: %v\n", data.Link)
    fmt.Printf(" Date: %v\n", data.Date)
    fmt.Print("Items:\n")
    for _, item := range data.Itemdata {
        fmt.Printf("\t%v: %v (%v)\n", item.Date, item.Title, item.Link)
    }
}
$ go run sample.go
Title: IPAセキュリティセンター:重要なセキュリティ情報
  URL: https://www.ipa.go.jp/security/vuln/icat.html
 Date: 2016-02-10 11:58:22 +0900 JST
Items:
    2016-02-10 12:00:00 +0900 JST: Microsoft 製品の脆弱性対策について(2016年02月) (http://www.ipa.go.jp/security/ciadr/vul/20160210-ms.html)
    2016-02-10 12:00:00 +0900 JST: Adobe Flash Player の脆弱性対策について(APSB16-04)(CVE-2016-0985等) (http://www.ipa.go.jp/security/ciadr/vul/20160210-adobeflashplayer.html)
    2016-01-20 12:00:00 +0900 JST: Oracle Java の脆弱性対策について(CVE-2016-0494等) (http://www.ipa.go.jp/security/ciadr/vul/20160120-jre.html)
    2016-01-13 12:00:00 +0900 JST: Microsoft 製品の脆弱性対策について(2016年01月) (http://www.ipa.go.jp/security/ciadr/vul/20160113-ms.html)
    2016-01-13 12:00:00 +0900 JST: Adobe Reader および Acrobat の脆弱性対策について(APSB16-02)(CVE-2016-0932等) (http://www.ipa.go.jp/security/ciadr/vul/20160113-adobereader.html)
    2016-01-06 16:40:00 +0900 JST: 【注意喚起】インターネットに接続する複合機等のオフィス機器の再点検を! (http://www.ipa.go.jp/security/ciadr/vul/20160106-printer.html)
    2016-01-05 14:00:00 +0900 JST: 「DXライブラリ」におけるバッファオーバーフローの脆弱性対策について(JVN#49476817) (http://www.ipa.go.jp/security/ciadr/vul/20160105-jvn.html)

icat for JSON” という名前なのに IPA は API の仕様を公開していない。 そこで JavaScript コードの中身を見てみた。

icat4json パッケージでは “icat for JSON” から取得した JSON データを以下の構造体にデコードする。

//Item - itemdata from icat
type Item struct {
    Title      string    `json:"item_title"`
    Link       string    `json:"item_link"`
    Date       time.Time `json:"item_date"`
    Identifier []string  `json:"item_identifier"`
}

//ICAT - data from icat
type ICAT struct {
    Itemdata []Item    `json:"itemdata"`
    Title    string    `json:"docTitle"`
    Fix      string    `json:"docTitleFix"`
    Link     string    `json:"docLink"`
    Date     time.Time `json:"docDate"`
}

JavaScript コードを見ると item_identifier 項目は使ってない模様。 docTitleFix 項目は中身が null かどうかしかチェックしてなくて1null 以外だと htmlentities() 関数を通さずに素のまま表示するという恐ろしいことをしている(普通こういうのって boolean 値を使うんじゃないのか?)。 これらの項目は無視でもいいだろう。 本当は IPA が仕様を公開してくれると有難いんだけどねぇ。

脆弱性情報をクライアントサイドで取るのなら “icat for JSON” ではなく Twitter の @ICATalerts アカウントのタイム・ラインをチェックするほうがオススメ。 JSON データを使うのならサーバサイドでやるべきだよね。 icat4json パッケージはドメイン・レイヤのエンティティとして使われることを意識している。

icat4json entity

私はたまたま Go 言語を勉強中なので Go 言語のパッケージとして実装したけど,本当なら Java とか Ruby とか node.js とかサーバサイドの実装があるといいよね。 IPA も jQuery じゃなくて,そういうので実装すればいいのに。


  1. ところで Go 言語における string の実体は []byte だが nil 状態はない。 icat4json パッケージでは docTitleFix 項目が null の場合は空文字列に展開される。 JSON の null 状態を区別したいのであれば github.com/guregu/null パッケージ等を使う手もある。ちなみに github.com/guregu/null パッケージの型の実体は database/sqlNullString 型等である。 ↩︎