こんにちわ、野良エンジニアです。
こちらのツイートを見て、取引所の脆弱性診断を定期実行するスクリプト(GAS)を作りました。
仮想通貨関連記事
<コイン相場 徹底解説!
<仮想通貨ウェブフォント 導入方法!
<Lisk を安く買う方法 徹底解説!
作ったものについて
定期的に脆弱性診断をやるスクリプトを作ったよ
mozilla の脆弱性診断 Observatoryを毎日早朝4時〜5時ぐらいに実行するスクリプト(GAS)。実行結果をスプレッドシートに記録します。Cryptocoin Junkey(@cryptcoinjunkey)さんや、ロン (Long)(@CEO_loves_tech)さんの調査対象になかった取引所や交換所なども追加してます。
2017/3/7 現在の結果はこんな感じ。取引所や診断結果ページにも飛べるようにしてるので、気になる方はスプレッドシートを開いてみてください。ロンさんも言ってる通り、このスコア的には BITMEX が最強、続いて Kraken、 AidosMarket、 bitFlyer、 Changelly、 Poloniex、 Cryptopia、 binance、 CoinExchange…と続いています。
チェック対象誤りや、他にも追加して欲しい取引所があればここにリプください。
補足
この脆弱性診断が全てではない、っぽい。けど、無視していいってものでもない、っぽい。
追記
想像以上に拡散されてるので、Observatory について記載されてるページを追記。
Mozillaは,Webサイトのセキュリティ分析ツールのObservatoryをローンチした。開発者とシステム管理者による,Webサイトのセキュリティ設定向上の支援を目指している。
使い方は簡単だ - WebサイトのURLを入力すれば,ツールが接続してHTTPヘッダを解析し,数値化されたスコアと調査結果を提供してくれる。サイトはさまざまなプロパティで確認され,問題の重要度に応じて,それぞれに負のスコア因子が課される仕組みだ。
2つ目のページでは、約18時間(実働時間は不明)で個人ブログのスコアをFからA+まで改善したようです。
※個人ブログだからできる話かも。取引所も同じ時間で同じ改善ができるってもんでもないはずなので注意。
どうして作ったの?
冒頭に貼った 仮想通貨交換業者は無職業者BOTと今すぐ顧問契約を結ぶべきだというお話 とか 仮想通貨の有名取引所の脆弱性診断したらBitMEXが最強だった を読んで、次のようなことを思ったから。
- 取引所のセキュリティ対策っぷりは気になる
- けど毎回サイトに入力するの面倒くさい
- スクリプトで自動実行して一気に見れると嬉しいよね
イマイチな点
改造したいなーと思ってる点(やるとは言っていない
- サマリや変わった箇所を整理してツイートさせたい
- 改善/改悪 履歴を残したい
- グラフ化
ここからは技術者さん向け
読んでも意味分からんって人は おまけ か まとめ にジャンプ!
ソースコード
普通にスクレイピングしても評価結果が取れない(JS で更新されてる)ので、PhantomJS Cloudを使ってます。無料で1日500回まで実行可能。
スプレッドシートのC列に診断用URLが記載してある前提。
※見えても嬉しくないので非表示にしてます。E列のリンク(https://observatory.mozilla.org/analyze.html?host=www.bitmex.com みたいなやつ)が書かれてます。
function getObservatoryScores() { | |
var book = SpreadsheetApp.openById('SpreadSheetKey'); | |
var sheetData = book.getSheetByName("シート1"); | |
var pjsApiKey = 'ApiKey'; | |
var urlBasePre = 'https://phantomjscloud.com/api/browser/v2/' + pjsApiKey + '/?request=%7Burl:%22' | |
var urlBasePost = '%22,renderType:%22html%22%7D'; | |
var colURL = 3; | |
var colGrade = 6; | |
var colScore = 7; | |
var colDate = 8; | |
var rowStartData = 2 | |
var rowEndData = sheetData.getDataRange().getLastRow() | |
for(var i = rowStartData; i <= rowEndData; i += 1) { | |
var url = sheetData.getRange(i, colURL).getValue(); | |
var fetchURL = urlBasePre + url + urlBasePost; | |
var response = UrlFetchApp.fetch(fetchURL); | |
var html = response.getContentText('UTF-8'); | |
var grade = getData(html, '<span class="grade-letter" id="scan-grade-letter">', '</span>') + getData(html, 'id="scan-grade-modifier">', '</sup>'); | |
var score = getData(html, '<span id="scan-score">', '</span>'); | |
if(grade === "" || score === "") continue; | |
sheetData.getRange(i, colGrade).setValue(grade); | |
sheetData.getRange(i, colScore).setValue(score); | |
var d = new Date(); | |
sheetData.getRange(i, colDate).setValue(Utilities.formatDate(d, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss')); | |
} | |
sortByScore(sheetData); | |
} | |
function getData(html, startTag, endTag) { | |
var searchTag = startTag; | |
var index = html.indexOf(searchTag) | |
if(index !== -1) { | |
var html = html.substring(index + searchTag.length); | |
var index = html.indexOf(endTag); | |
if(index !== -1) { | |
return html.substring(0, index); | |
} | |
} | |
return ""; | |
} | |
function sortByScore(sheetData){ | |
var sortRange = sheetData.getRange("A2:H"); | |
sortRange.sort([{column: 7, ascending: false}]); | |
} |
参考にしたページ
おまけ:色んなサイトの評価結果
適当に脆弱性診断やりました。このチョイスに特に意味はないです。調べてみると、世界的なサービスでもA評価を取得するのは難しいようですね。
Amazon
Rakuten
YouTube
ニコ動
はてなブログ
Valu
StackOverflow
Qiita
Teratail
ドットインストール
GitHub
Observatory
まとめ
このスプレッドシートで最新の脆弱性診断結果が一括で見れる、っぽい。
Lisk を少しでも安く買いたい方必見!
仮想通貨関連記事
<コイン相場 徹底解説!
<仮想通貨ウェブフォント 導入方法!
<Lisk を安く買う方法 徹底解説!