海外ユーザのためのVAddyの時刻表示

  • 3
    Like
  • 0
    Comment

これはVAddy Adventカレンダー7日目の記事です。
VAddyは、継続的なWeb脆弱性検査を簡単に実現できるSaaSです。
https://vaddy.neta/ja

私の好きなクラフトビールで第1位はデモーレン Vuur&Vlamと紹介しました。第2位は、BrewDogのJack Hammer IPAです。これです!!美味しいです!!
六本木にBrewDog直営のバーがあるので是非そこで飲んでみてください。毎日あるわけではないので、もし無かったら次の日にも行ってみてください! 一人で行くのに気が引ける人は私を誘ってください!

海外ユーザへの対応

VAddyは海外展開も行っているため現在は海外ユーザの割合が半分ほどになっています。したがって海外ユーザのタイムゾーンも考慮した設計にする必要がありました。
現在考慮しているのは下記の3つです。

  • 画面上の現地時刻変換
  • APIサーバが返すデータの時刻
  • バッチ処理の実行時間

今回は「画面上の現地時刻変換」と「APIサーバが返すデータの時刻」の2つを説明したいと思います。

画面上の現地時刻変換

VAddyで扱うデータの中で時間に関するものは、検査実行時間や何かデータ登録・編集した時間です。ですので、オークションや定時実行を前提とするようなシビアな時間処理は必要ありません。

現在はDBのレコードは全てUTC(GMT)で保存しています。
画面上では、DBから取得した時刻データをmoment.jsというjsライブラリを使って処理しています。これを使うことで、ユーザのローカル時間に合わせて時差を変換してくれるので大変便利です。

DBからデータを取得すると 2016-12-07 15:29:30 という形式のため、その文字列をそのままmoment.jsに渡して時差変換しています。

moment.jsのライブラリを読み込んだ状態で下記のようにします。

$time = '2016-12-07 15:29:30';
moment.utc( $time ).local().format("YYYY/MM/DD HH:mm:ss");

utc()というメソッドを使うと、渡したデータがUTC基準であると認識してくれます。これを元にlocal()メソッドを使って現地時間に変換し、最後に時刻出力フォーマットに整形しています。

APIサーバが返すデータの時刻

APIサーバから返すデータはUTCで、フォーマットはISO 8601という形式です。
2014-06-12T11:11:11+0000
このようなフォーマットになっていて、時刻の最後に+0900のようにUTCからの時差を付与するものです。
APIサーバから返すデータはプログラムが処理する可能性が高いため、あえて時差変換して返すよりも決まったフォーマットで時差が分かるようにしたほうが扱いやすいためです。

ちなみに、VAddyの脆弱性検査で脆弱性を発見するとAPIからは下記のJSONが返ってきます。
脆弱性があった場合は、alert_countが1以上になります。
scan_result_urlにセットされているURLにアクセスすると、脆弱性があったURLと該当パラメータなどの情報確認できます。

{ "status":"finish",
  "fqdn" : "www.example.com",
  "scan_id" : "1-837b5f9f-e088-4af5-9491-67f7ce8035a4",
  "scan_count" : 22,
  "alert_count" : 1,
  "timezone" : "UTC",
  "start_time" :  "2014-06-12T11:11:11+0000",
  "end_time" :  "2014-06-12T11:11:11+0000",
  "scan_result_url" : "https://console.vaddy.net/scan_status/1/1-837b5f9f-e088-4af5-9491-67f7ce8035a4",
  "complete" : 100,
  "crawl_id" : 30,
  "scan_list" : ["XSS","SQL Injection"]
}

APIの利用方法はAPIマニュアルを参照ください。
このAPIをコマンドラインから簡単に操作するgolangで作ったツールgo-vaddyも公開しています。こちらはバイナリもgithubに置いているのでダウンロードすればすぐに利用できます。

This post is the No.7 article of VAddy Advent Calendar 2016