先日、こんなコメントを頂きました。
自動投稿アプリからの投稿は、viaがそのアプリ名になると思うのですが、Twitter for webやTwitter For App のように表示することは可能でしょうか。自作のアプリからいかにも投稿された感を払拭したいのですが。。なにかいい案はありますか。
viaはツイートの投稿経路を表す役割なので、TwitterBotからツイートしたものを「ブラウザからツイートしています」という表示にすることは出来ません。
そのため、この質問に関しては『方法はない』という回答をしました。
…が、本当はブラウザに保存されている『Cookie』という場所に入った情報を使えば『ブラウザ経由』と偽装することが出来ます。
ただこの方法はセキュリティ的には非推奨な方法なので嘘をつきました。申し訳ない。。
今回は『Cookieの解説』というテーマで「viaをブラウザからの投稿である『Twitter Web App』にしてツイートするBot」を作ってみたいと思います。
【実践】Cookieを使ってTwitterに投稿する
下準備(GASで作る場合)
簡単に準備出来るため例によってGASを使用していますが、Cookieを入れてリクエストを送れる言語であればどんなでも問題ないです。構成はほとんど変わりません。
コード上部の
- authToken
- ct0
- bearerToken
をこれからブラウザから取得してきてコピペしていきます。
ブラウザから必要な情報を取得する
Twitterのページでデベロッパーツールを開きます(Chromeの場合『右クリック』→『検証』)
ct0とauthTokenの場所
bearerTokenの場所
画像を参考に必要な情報を集めます。
投稿してみる
取得したデータを先程書いたコードに入れて main という関数を実行します。
Cookieのデータを送るとサーバーは「認証が既に完了している」と認識されるため、認証を挟まずにツイートを投稿できます。
ちなみにブラウザ上でログアウトしてしまうとCookieの情報がリセットされるためツイートできなくなります。
【解説】Cookieの仕組み
ログインするとブラウザのCookieに認証完了を証明するデータが入る
そもそもCookieとなんなのでしょうか?
Cookieとはサーバーから送られるその人専用のデータです(保存する場所を指すこともあります)
認証情報以外に色々保存しているのですが、今回は認証情報に限定してお話します。
例えばTwitterにログインする時、本人確認をするためにユーザー名とパスワードを入力すると、Cookieに本人だと証明された証拠としてのトークンを保存され、アクセスする時に送りたいデータと一緒にCookieを送ることで本人確認しながらデータをやり取りすることが出来るようになります。
もしCookieがない世界だった場合、ツイートする時も、フォローする時も、ツイートを取得するときも、AさんがAさんである証明が出来ないため、毎回ユーザー名とパスワードを入力してもらう必要があります。
現実の世界でいうチケットの半券のようなものを想像してもらえるといいかもしれません。
Cookieのデータがあればその人が動かしたようにプログラムが動く
Cookieはログインしたブラウザにしか保存されない前提で作られているので、Cookieのデータが含まれていればそのブラウザからアクセスしているものとみなされます。
今回作ったプログラムは今回ログインしたブラウザでログインしたことになっている”はず”の場所からのデータなので、ブラウザから投稿したように投稿されます。
「あれ?ユーザーIDとパスワードがなくてもCookieさえあれば自由になりすませるんじゃね?」
はい、そのとおりです。
つまりCookieの情報はとっても重要
Cookieが漏れてしまうと勝手にアカウントを乗っ取られるかも?
今回は自分のCookieを別の場所に送って自分自身になりすましてツイートしましたが、もしもCookieを利用して『ユーザー名とパスワードを勝手に変更』されたらどうなるでしょうか?
今回非推奨とした理由はこのようにユーザーIDやパスワードと同じレベルで重要な情報をコードに貼り付ける行為なのでおすすめしませんでした。
普通のサービスであればCookieの情報が流出しないような工夫がなされているはずなので安心してください。
しかしプログラミング初心者が作ったサイトの場合、そうはいかない可能性があります…!
ブラウザのCookieを盗むコードは簡単に書けてしまう
適当なページを開いてブラウザのデベロッパーツールのConsoleタブに
console.log(document.cookie);
と入力してみてください。
ズラッとCookie情報が表示されたと思います。
実はJavaScriptを動かせれば簡単にCookie情報を取得することが出来てしまいます。
そしてそのCookie情報をどこかのサーバーにデータを送るプログラムも書けてしまうのです。
普通、開発者以外の人が誰かのパソコンの上でJavaScriptを実行させることは出来ないのですが、掲示板のように「みんなが書いた文章を共有する」場所では可能性が出てきます。
画像のように投稿にプログラムが書いてあるとページを読み込んだ時にJavaScriptと勘違いしてプログラムが実行されてしまうことがあります。
データを送らなくても『投稿を見たらユーザー名とパスワードを書き換える』というプログラムを仕込まれていたら全員がアカウントを乗っ取られる状態になりますね。
このような状態をXSS(クロスサイト・スクリプティング)といいます。
Cookieを盗まれないようにする実装は絶対に必要
入力された文字がプログラムとして判断されないように工夫する
まずはXSSを防ぐことが重要です。
方法としてはそもそもプログラムを表す <script> という文字を書かせないように<>などの記号を禁止したり、<などの記号に変換(エスケープ)したり、様々な方法があります。
簡単に導入できるので必ず対応を入れましょう。
JavaScriptからCookieを覗けないようにSecureフラグを立てる
万が一XSSを実行されてもCookieの中身を取得できなければ乗っ取りが起こることはありません。
Cookieをセットする際に HttpOnlyオプションを付けたり、Secure オプションで安全な通信でないとCookieを送らないような設定をすることでXSSの被害を抑えることが出来ます(XSSされた時点で問題だけど)
まとめ
今回は実際に『Cookieが流出したらどんなことをされてしまうか』を体験した上で、セキュリティ周りに触れてみました。
- CookieがあればCookieの持ち主本人になりすませる
- 誰かのCookieを盗むプログラムは簡単に作れる
- Cookieを守るサイトを作ることはエンジニアの義務
これらのことを覚えて頂ければ幸いです。
あ、セキュリティの専門家ではないので、もし間違っている内容があれば教えてください。
ここまで読んで頂きありがとうございました!
コメント
こないだviaのコメントしたものです。大変興味深い記事ありがとうございます。楽しく読ませていただきました。
記事をふまえて幾つか質問させていただきたのですが、このようにviaを偽装するプログラムは、自身のCookieが盗まれるリスクがあるということでしょうか。他に考えられること、対策はありますか。また、そもそもの話なのですが、プログラムに疎い人間は、技術強者に知らず知らずにCookieのようなデータ情報を取られてしまうことがあることをこの記事で危惧しました。プログラミングを解説なさっているブロガーさんは、自身が作成したライブラリを使えるようにしてくれていますが、使うことでこのようなことは起こりえますか。(まさに私は、ベルツさんのライブラリを使用させてもらっておりますが。。疑っている解釈を与えてしまってすみません。。)質問が立て続けになり申し訳ありません。今後セキュリティやシステム面もプログラミングをしていく上で学んでいきたいものです。。
読んで頂きありがとうございます!
> このようにviaを偽装するプログラムは、自身のCookieが盗まれるリスクがあるということでしょうか
今回作ったプログラムは盗まれるリスクは低いです。敢えて対策を言えば誰かとプログラムを共有したりしないように気をつけることですかね・・・。
通常使っているブラウザだけに置いてあるはずの情報を外に持ち出しているので、『会社のPCを勝手に外に持ち出している』感覚に似てる気がします(´・ω・`)
どんなプログラムも100%安全なものはないからこそ、『脆弱性が見つかった』とか『個人情報が流出した』というニュースが出てくるわけなので、例えば今回の場合「GASのセキュリティが破られて公開にされた時はTwitterのアカウントが乗っ取られる可能性が出てくる」ということで『絶対大丈夫』とは言えないです。
そんなこと言ってたらどのサービスも使えないので最終的には自己判断になるかなと。。
> プログラミングを解説なさっているブロガーさんは、自身が作成したライブラリを使えるようにしてくれていますが、使うことでこのようなことは起こりえますか。
起こりえます。なので使う場合はコードをざっくり確認する癖は付けていた方が良いです(が、実際にやっているのはまだ見たことないですね)
ただGitで☆がたくさん付いているライブラリや使用者が多いライブラリは「調べる工数」に対して「怪しいコードが含まれている可能性」が見合わないのでそこまで神経質になってはないですねー。。
こんばんは。viaに関して12月の初めに質問いたしましたkといいます。
ベルツさんのブログを参考にし、ツイッターの自動実装を試みているのですが、エラーが表示され、直しては再びエラーが起こり、手詰まりになっております。
突然ではありますが、もし可能であれば、ベルツさんが作られた自動ツールそのものを購入させていただくことは出来ないでしょうか。ご検討よろしくお願いいたします。
ぬ…エラーが出てしまいましたか…( ・`ω・´)!?
購入と言っても記事に書いているコードそのままなので、まずはエラーを確認させて頂きたいです。
Cookieを使った投稿だとセキュリティ的にコメント欄でのやり取りは危険なので、後ほど k さんが登録されているメールアドレスに後ほどメールを差し上げます。
可能な範囲で結構ですのでエラーの内容をそこで教えて頂ければ幸いです!
よろしくお願いいたします!
Twitterにログインをしたら自動でcookieを取得することは可能でしょうか?
出来ません(正確にはCookieは取れるけど認証に関わるCookieは出来ません)
セキュリティの話になってしまいますが、プログラムの中で自動でCookieを取得出来てしまうと認証情報をどこかに送って勝手に利用されてしまう恐れがあるので、Twitterが取得できないように設定しています。