インターネット掲示板redditに、1,500人のユーザーが使用しているイントラネットアプリケーションに含まれるJavaScriptコードが掲載され、その出来のひどさから注目を集めています(元々の投稿は2017年に行われたもののようですが、最近はてなブックマークで注目されていたのでご紹介)。
上記の抜粋されたコードは、ログインボタンがクリックされた際、入力されたユーザー名とパスワードを取り出し、データベースの情報に存在するかどうかをチェックし、ログインできるかどうかを確認する、いわゆるユーザー認証を行っている部分です。
関数authenticateUserの最後に存在する「if ("true === "true")」のような、一件して意味不明な部分のほか、さまざまなひどい処理が詰め込まれていると指摘されています。
目次
短いコードにいろいろと凝縮
Redditには上記コードに対してさまざまなコメントが寄せられています。先ほど例としてあげた、最も分かりやすい「if ("true === "true")」以外にも例えば以下のような問題点が指摘されています。
- クライアントサイド認証
- 全ユーザーの詳細データを取得している
- 入力値の検証なし
- ユーザーに対しログインできたかどうかのフィードバックがない
- プレインテキストパスワード
- パスワードに対してハッシュ処理がおこなわれていない
- SQLインジェクションが可能
- Cookieを偽装しただけでログインできる
他にもさまざまな興味深い指摘が行われていますので、開発者の方はオリジナルのスレッドで問題点をご確認ください。
今回のコードはクライアントで動作するJavaScriptで処理がおこなわれていたため問題が発見されましたが、通常ソースコードが確認できないサーバーサイドプログラムではどのような処理がおこなわれているのか、ユーザーから知る方法はありません。内部的には今回取り上げられたのと同様なひどい処理がおこなわれているプログラムを知らないうちに使っているということもありそうです。