[Javascript] WEBブラウザでJS無効の場合のサービス検討思考

2016年10月22日

Javascript テクノロジー プログラミング 学習

いや〜参った!! WEBエンジニアをやっている人でjavascriptを知らない人はいないと思うが、 今現在で、javascriptが使えないWEBアプリを考えるのってこんなに大変なのか! という事を思い知らされました。

事象発覚!

それは会社で初めて作る新規商材の開発中の事でした。 セキュリティに対応したWEBツールを作ろうという事で、色々なサイトで便利にJSタグを貼るだけで、色々なセキュリティシステムを導入できるというコンセプトで進めていた所、 あるシステムでBOT対応を行うという内容だったんですが、
通常、BOTはJavascriptを必要としないページ遷移を行う為、javascript無効ブラウザと同じと考えたほうが良い
という意見が出てきて、そもそもjavascriptベースでの展開を考えていたのに、思いっきりちゃぶ台をひっくり返されてしまいました!!!

何故javascriptが使われないのか?

サーバーサイドプログラムを作れる人は分かると思いますが、WEBクロール技術は比較的容易に作ることができます。 おそらくもっとも簡易なものはサーバーサイドでwgetやphpのfile_get_contentsなどでURLを指定すると、対象サーバーのHTMLやPHPなどのWEBブラウザでレンダリングするべきソースコードが取得できます。 単なるWEBクロールという要件であれば、この時点で満たされており、この中のAリンクをたどれば、サイトや別ページなどこのページ内から遷移できるリンクの一覧取得もできるし、そのURLに対してさらにwgetすればいいという事。 お気付きの通り、Javascriptなどなくても、こうしたことは簡単にできるのである。

最近流行りのbot

流行っているかどうかは正直知らないが、「リスト型攻撃」と言われているBOT攻撃があり、よくニュースなどで取り上げられている企業の「個人情報が流出」という場合に、サイトのIDとパスワードが流出した場合、この個人情報は、裏の世界で高値で売買されているらしい。 (僕も正直、詳しくは知らないが、大体想像すればわかる) そしてリストを手にした人が行うべきことは、その個人情報が流出したサイトにアクセスして、手にしたIDとパスワードを入力すると、いとも簡単になりすましログインができるというモノなんです。 でも、流出後すぐにお知らせが行き渡り、速攻でパスワードを変更する堅牢なユーザーもいるため、流出したパスワードが全て有効であるとは限りません。 さらに、流出した個人情報が10件や20件であれば手作業でいいのだが、数万件や数十万件、それよりも多い桁数の場合、人の手でいちいち確認など行うことは極めて非効率でしょう。 そこで、BOTシステムの登場です。 簡易に組まれたプログラムで自動でリストの数分、繰り返しログイン処理を行ってくれて、ログイン成功したリストをさらに作ることができれば、パスワードが生きているリストの出来上がりである。 こんな恐ろしいことが世の中で起こっているんですね。 流出ニュースを聞いたらすぐにパスワードを変更しましょうね。

エンジニア的対応方法について

WEBサイトにおけるこうした対応方法としては、色々な対策があると思いますが、今回検討したのは、機械が行っている事に対して人でしか判別できない事をバリデーションとして組み込む事によって、手作業でしか進行できなくなるWEBページができます。 いわゆるBOT攻撃を無効化する事ができるんですね。 リスト流出の場合、かならずログインページが標的になってBOT攻撃が始まりますが、ここで行うべき対策は「テキスト・キャプチャ」と呼ばれるGoogleなどがサービス提供しているものを導入するだけで簡単に防ぐことが可能なようです。 ただし、このテキストキャプチャ、見た目に見えにくい文字も中には存在していて、人間の目で読めないものはログインもできないというリスクも含んでいます。 でも、何度もリロードしながら確実に人間がログインするという事で、多くのサイトに使われているようです。 僕がよく目にするのは、ダウンロードサイトでROBOT的にDLされないようにテキストキャプチャが仕込まれているのをよく見かけます。

javascriptでの対応

テキストキャプチャをサイトにセットした後で、サーバーサイドプログラム側に、テキストキャプチャでちゃんと認証が成功しているかという確認が行われるのですが、これをやらないと全く意味がないんですね。 だって、認証失敗していたら、失敗ページにリダイレクトしたり、エラー文字を出して進めなくしないと、ログイン成功してしまいますからね。

ブラウザでjavascript無効にしたらどうなるの?

意外とシンプルな考えとしてjavascriptを向こうにする事って有りえますよね? もちろん無効にしていたら、満足にWEBページが動作しないものもたくさんあります。 恐らくtwitterやfacebookなどは、動作しないんじゃないでしょうか? しかし、botプログラムはjavascriptを含まずに行うものがほとんどであると過程すると、サーバーサイドでの対応はもちろんですが、 javascriptで対応完了と考えている人にとっては、痛手を追うことになるでしょう。 ということで、下記色々と検証してみました。

scriptタグの動作

javascriptを向こうにしたブラウザでアクセスしたページのscriptタグはどのような扱いになるかというと、僕の予想では、src先のURLにアクセスして、ソースを取得するが、スクリプトの実行が行われないという事だったのですが、結果は、srcすらアクセスされません。 恐らくJS無効というのはscriptタグがdisable化する事なんですね。 もちろんscriptタグ内に直接書かれているプログラムなど、たんなるコメントになってしまうという事です。

imgタグの扱い

javascriptのsrcをIMGタグのsrcにそのままもってきたらどうなるか? サーバーアクセスは行われ、対象のURL先がPHPなどの場合、ちゃんとPHPが実行されます。 これにクエルを付けるとある程度の操作はできるようです。 ・・・が、その後のアクションが画像を表示するという事以外行えないので、ログを取得するレベルでしょう。 しかも、JSでないと取得できない、location.hrefや、ユーザーのセッションIDなどは、取得、保持が難しい可能性が高いので、満足なログが書けるとも思えないですね。

noscriptからのリダイレクト

この方法が一番しっくりきました。というか、他の方法は問題アリアリですからね。 そもそも最近のWEBページとしてはjavascriptでなければNGというポリシーで問題ないと思う。 その理由の一つとして、先程のBOTがJS無効が多いとするならば、JS無効はNGとしてしまうとそれだけでBOT防止になるという事だからだ。 そしてJS無効有効であれば、javascriptによる便利な対策がなんとでもできるからだ。 ちなみに、書き方は以下のとおりね。 <noscript><meta http-equiv="refresh" content="0; URL=http://google.com"></noscript> これを通常のscriptタグのすぐしたにでも書いてあげれば(headタグ内)大丈夫という事。

あとがき

noscriptが有効と書いたが、実はwgetでサイトアクセスしてみたら、noscriptのwebページソースコードがまるまるDLできたので、あくまでブラウザでの利用に関してという事だろう。 SeleniumによるBOTであれば、有効かもしれないね。 とりあえず、今後もこうしたセキュリティ向上を狙っていきたいという考えです。