それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ゆうちょ銀行もスクレーパーかけたら、色々終わってた。

パスワードの話はこっち→ゆうちょ銀行のパスワード紛失したので、再発行手続したら、コーヒー吹いた話。

ゆうちょ銀行のスクレーパー

ゆうちょ銀行のタイムアウトがきついのと、「ホームへ」ボタンを押さないとセッションエラーになるので頭に来た。ブラウザ戻るボタン。押させろよ。

ちょっと本気スクレーパーを書いてやった。スクレーパーを書いて気づいた。ゆうちょ銀行のオンラインは色々終わってた。(後述)

ゆうちょ銀行は

ゆうちょ銀行にはログインのために以下の3つが必要になる。

  • ID 1234-5678-09876
  • 合言葉 [質問,回答][質問,回答][質問,回答]
  • パスワード

リクエストの仕組み。ボタン押した時にFormにActionとhidden eventを入れてSubmitする。
これだけわかればあとは簡単。

サンプル

require 'yucho_bank.rb'

cli = YuchoBank.new
#お客様番号
cli.id="6666-9999-33433"
#合言葉と回答リスト
cli.passphrase_list["初恋の人の名前は何ですか?"] = "恋するために出会うために来ていく服がない"
cli.passphrase_list["初めて映画館で見た映画のタイトルは何ですか?"] = "映画館行ったこと無い"
cli.passphrase_list["母親の旧姓は何ですか?"] = "天皇家には、苗字はありません"
#ログインパスワード
cli.password = "****password****"
cli.login
cli.go_page("現在高照会")
puts cli.current_page.search("xpath to amount")
cli.go_home()
cli.go_page("更新")

こんな感じ

ゆうちょ銀行のスクレーパー

yucho_bank.rb

ソースコード載せるつもりだったけど、パスワード関連の話のほうが面白いので、Qiitaにとりあえず、なげた。

ゆうちょ銀行のタイムアウト早すぎだとおも

いくらなんでも、早すぎだと思う。

現金を動かすトランザクション中にいるならともかく、残高照会で期間を選んでいるうちにタイムアウトするぞ。馬鹿か。
そういう場合は、とりあえず、タイムアウトさせずに、ログイン後のホームへ押し戻しておけばいいものを。

速すぎるタイムアウトにセキュリティ上の意味はない。

「ユーザーがパスワードを暗記してくれる」という反復学習効果しか期待できない。

そして暗記したパスワードは変更しなくなるので、むしろ恐ろしい。
そして暗記したパスワードは話のネタに、安易に教える可能性が高い。

セキュリティとか以前に終わってる

終わってるんですよ。色々と

意味がわからない。ログイン画像。

セキュリティ上の意味は全くない。。。。

これ何の意味があるのか全く理解出来ないんだけど。


一人で複数の口座を持っているときに区別が付くかもしれない

ゆうちょ銀行の公式の解説

公式の解説によるとこうだ。

(スクリーンショット 2012-02-24 15.50.17)

画像の登録をしていただきますと、ログインパスワードを入力する画面上に、ご登録いただいた画像が表示されます。その画像がお客さまご自身で登録したものであれば、ゆうちょダイレクトの正規の画面です。

なるほどー、画像の表示に認証してるんですね。

ってことで画像のパスを見てみたよ

(スクリーンショット 2012-02-24 15.57.34)

<img src="pages/etc/image/TravelCulture/TC19/2005_08_12_415.jpg" alt="旅行・文化 40" height="100" width="100">

え、GET引数持ってないの?そうか、セッションIDで見てるんだね。じゃぁ画像直アクセスは見られないんですよね。



実際の画像URLはこちら。

https://direct2.jp-bank.japanpost.jp/tp1web/pages/etc/image/TravelCulture/TC19/2005_08_12_415.jpg

見れる。サンプル


アカンわ。クズだ。


IMGタグに、丁寧にALTまで入れてる時点で怪しいと思ったんですよねぇ。

ログインシールってのは「Cookieの有無が一目でわかる」からフィッシング詐欺防止に役立つんじゃなかったっけ?

むぅ


画像のURLはすべて同じで、ユーザー毎(Cookie毎)に違う画像を出すなら、意味はまだある。

あと、質問を自分で決められないのがアウトだ。

そして質問内容が失礼すぎる。「母親の旧姓は?」とか、両親が揃ってるイイところのお嬢ちゃんとお坊ちゃんがそのまま、大きくなって大企業に就職して自分の常識を疑ってない好例だよね。母親の旧姓とは大変失礼だと思いました。



ゆうちょ銀行もクズだ


これが日本の技術力()だよ。

第三次オンライン世代の団塊世代はとっと引退しろ。インターネット世代に変えておけ。

まだまだある、ゆうちょ銀行のヤバい点

更に続くよ。

ゆうちょ銀行のパスワード紛失したので、再発行手続したら、コーヒー吹いた話。

ゆうちょ銀行のパスワード紛失したので、再発行手続したら、パスワード印字した藁半紙が届いた。\(^o^)/

ゆうちょ銀行のスクレーパーを書くに当たり、パスワードと合言葉がわからなかったので初期化をお願いした。
初期化をお願いしたのに、窓口のお姉さんに「再通知ですね!」とか言われた。きっと言い間違いだろうと思ってたら、本当にパスワードが平文で届いた。

パスワードを忘れたので郵送通知をお願いした。

前のパスワード印字した藁半紙が届いた。\(^o^)/

おお紙よ。あなたは覚えていらっしゃった。忘れたパスワードが印字されて郵送されてきた。

マジでドン引きしたわ。

忘れたパスワードが送られてきたよ。
(パスワードが印字されて届いた。)
(暗証番号も印字されて届いた。 )
さすがにこれはドン引きしたわ。

これ情報処理センタのバイトが手作業で封してるんですよね・・・

これね、紛失したパスワードが平文でそのまま届きましたよ。再発行じゃなくて、以前のものがそのまま。


郵送で送るかぁ。。。。

  • パスワードを平文で保持してる点がアウト。
  • それを印字して郵送してくる点がアウト。
  • パスワードを郵送する手続が簡単すぎるのがアウト。

配偶者のゆうちょ銀行のパスワードくらいならすぐに手に入るよ。

そこから暗証番号やら、よく使うパスワードのキーフレーズやらが漏れる。これはたまらない。

アウトだアウト。

平文で保持してる点とかそういう問題以前に、印字するわ、郵送するわ、なんだこれは。

彼らにとって照会であって再発行じゃないところ。

ただし、ゆうちょ銀行は

料金面とサービス面では群を抜いている。


18:00まで窓口を開けてる銀行が他にあるかい?

頑張れゆうちょ銀行。

で、どうすればいいの


ゆうちょ銀行からのご相談の連絡をいつでもお待ちしてますよ。


サービスアドバイザとして僕を雇ってください。(違


2017-12-27 追加

ゆうちょ銀行の窓口でパスワード紛失しました−と言ったら、「パスワード照会」しますねーって言われたので、未だにこのままだと思います。

2018-01-10 追加

パスを記入した藁半紙が届いた。全然変わってなかった。

ゆうちょ銀行のスクレーパー

ゆうちょ銀行にログインして、データ取り出すruby スクリプト。



require 'rubygems'
require 'kconv'
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
require 'mechanize'

class YuchoBank
  attr_accessor :password, :passphrase_list, :id, :password,:m
  def initialize()
    self.password = ""
    self.passphrase_list = {} #合言葉の質問と回答ペア
    self.id = ""
    self.password = ""
    @is_login
  end
  def login()
    self.start
    self.send_id
    self.send_aikotoba1 # first_time
    self.send_aikotoba2 # second_time
    self.send_password # パスワードを送る。
    @is_login = true
  end
  def start() @m = Mechanize.new end
  def send_id
    id= self.id.split('-')
    @m.get START_URL
    #お客様番号を入れる。
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou1"}).first.value = id[0]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou2"}).first.value = id[1]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou3"}).first.value = id[2]
    self.send_request("次")
  end
  alias send_aikotoba1 send_aikotoba
  alias send_aikotoba2 send_aikotoba
  def send_aikotoba()
    return :skip unless @m.page.title =~ /合言葉/
    q_text = @m.page.search('div.loginbox table td span.bold').first.text #合言葉の質問を探す。
    #合言葉の回答入力エリア
    e = @m.page.forms[0].field_with(:name=>"aikotoba")
    #合言葉の入力
    e.value = passphrase_list[q_text]
    #合言葉の送信
    self.send_request("次")
  end
  def send_password()
    #パスワードを入力
    e = @m.page.forms[0].field_with(:type=>"password")
    e.value = password
    self.send_request("ログイン")
  end
  def send_request(button_name)
    #JavaScriptのsend_requestをFakeする。
    button = @m.page.search('//input[contains(@value,"'+button_name+'")]').first
    #ボタンを押した時に遷移する。URLを指定する。
    action = button.attr('onclick').split(',')[1].gsub(%r"'", "") #=> ex "https://direct3.jp-bank.japanpost.jp/tp1web/U010701BLC.do"
    @m.page.forms[0].action = action
    # event のフィールドに値を入れる。
    event_value = button.attr('onclick').match(/new Array\('([^']+)'\),false/)[1]
    @m.page.forms[0].fields.select{|e| e.name == "event"}.first.value = event_value
    @m.page.forms[0].submit
  end
  ####ログイン後に使う。
  #ホーム
  def go_home()
    self.send_request("ホームヘ") if @is_login
  end
  #残高照会
  def zandaka_shokai()
    self.send_request("現在高照会") if @is_login
  end
  def go_page(button_name)
    self.send_request(button_name) if @is_login
  end
  def current_page
    @m.page
  end
  def current_page_body
    @m.page.body.toutf8
  end
end



view raw
yucho_bank.rb
This Gist brought to you by GitHub.