はてブの脆弱性っぽい話
あなたのはてなIDは…(数秒待ってください。。)
探し中…
探し中…
探し中…
このページはなに?
あなたのはてなIDとあなたの非公開はてなブックマークをもぞもぞと取得して表示させるページです。
はてなIDを持っていて、はてなブックマークにログインしている必要があります。
どうやってはてなIDを取ってるの?
どうやって非公開ブクマを取ってるの?
まず知ることは、はてなの Web API は my というキーワードが自身のユーザーIDのエイリアスになっていることです。これを利用し、ページを訪れた人のマイブックマーク全文検索APIを Cookie 認証で叩きます。ここで得られたブックマークのうち、一つの公開ブックマークの URL とタイムスタンプを覚えておきましょう。
次に、その取得した公開ブックマークの URL を使って、はてなブックマークエントリー情報取得APIを叩きます。返ってくるのは、その URL にブックマークした人の一覧です。
ここで得られたエントリーブックマークのユーザーID付きタイムスタンプと、先に得られたマイブックマークのタイムスタンプを照合することで、マイブックマークのユーザーIDを導けます。これによって、ページにアクセスした人のはてなIDを決定できました。
非公開ブックマークの方は、先のマイブックマーク全文検索APIを my エイリアスを使って Cookie 認証で叩くことで取得できます。
つまり?
ページにアクセスした人のはてなIDを決定でき、なおかつそのはてなIDと結びついた非公開ブックマークを取得できてしまいました。非公開ブックマークってなんでしたっけ。
はてなブックマークのことは好きですが、この仕様にはちょっとびくびくですね。
ブックマークの取得について。
マイブックマーク全文検索APIは query が必須かつ一度での取得件数の上限もあるため、全てのブックマークを一括で取得することはできません。また、検索の仕様がよく分かりませんでした。URL も検索対象なのですが、http で検索しても全ブックマークが返ってくる対象になるわけでもないようです。そのためこのページでは例として、com, ne.jp, co.jp の3つを query として叩いています。jp を query にしても期待したような結果が得られませんでした。また、同じ URL を叩いてもレスポンスが異なる場合もあり結果に揺れがあるようです。とは言え、今回は通信回数を抑えていますがより多く API を叩けば非公開ブックマークをその分引っ張ってくることができるでしょう。
このページで取得したはてなIDなどは外部へ飛ばしていないことも添えておきます。