Javascriptでログイン処理。教科書に載せたいレベルの悪いプログラミングの見本。全ユーザーのログイン情報も漏洩。




はっしー@海外プログラマ元社畜
@hassy_nz

世界最悪のログイン処理コード。
実際のサービスで可動していたものだとか……https://t.co/C2bG93ZCkj

2018年08月10日

教科書に載せたい、つっこみポイント。

1.Javascriptによるログインの処理の大胆性
 全ユーザーのデータをブラウザにダウンロードさせている。

2.SQLを直書きする危険性
 悪意あるSQLを実行させることにより、全ユーザーのデータを削除できる可能性がる。

3.ユーザーのパスワードを平分で保存している問題性。

4.if (“true” === “true”) { return false; }という哲学性。

5.プログラムの1行目のコメント「TODO: put this in a different file!!!」のそこじゃない性
 察するに、このコードの作者は、サーバーサイド側のプログラムを扱えない or 触る権限がない、さらにデータベースのこともあまり分かっていないために、暫定的に、JavaScript側でログイン処理を実装してしまったのだろう。そして、このような対処は自分でも良くないことは分かっているので、プログラムの1行目に「TODO: put this in a different file!!!」(最後に!が3つ並んでいるところが、緊急性を代弁している)と記入しているのだが、違うファイルだとしてもダメだ。

みんなの反応どうでしょう

Sin@考えるシステム屋
@Sin_0006

あーパスワードハッシュ化されてないのね。クソコードならよくあるよねー。「"true"==="true"」?哲学かな?まぁあるよね。お、テーブル丸ごと取得してforループで探索とは漢だ。クソ度高いな。

・・まで読んでようやくこれがJavaScriptであることに気づきました。そんな馬鹿な。

2018年08月10日

助手さん
@joshu_san

よくあるクソコード、じゃなかった。まずアカウント情報をクライアント側にすべて漏洩させてから照合…だと???

2018年08月10日

たるはち@闇落ち
@tarupachi

SQL InjectionさせないようにSQLをパラメータで組み立ててない。優秀じゃないですか。と返答しようとしたところで、apiService.sql()の存在に気がついてしまいました。
その他の無駄なループや、true===true全員分のID/passwordをクライアントに渡していること、cookieなんて誤差だった。

2018年08月10日

Sugi
@sugimount

if ("true" == "true") の部分がチャーミングですね

2018年08月10日

JotarO_Oyanagi
@JotarO_Oyanagi

リンク先の reddit にあるこのコメントwwwww

“something about if ("true" === "true") speaks to me on a spiritual level”

2018年08月11日

嶺らるうぉーたー@Laravel
@Kaz_zaX

これがJavaScriptであるという事実で背筋が凍ったところで、
改めて1行目のコメント読むと爆笑するしか。。
お前違うファイルに持ってってもダメだろうがよ!!

2018年08月11日

MAHALITO
@mahalito_wiz

これってブラウザ側でクッキーの
loggedin ってのをyesって書き換えたらログインできたことになるんじゃないでしょうか

2018年08月10日

kiyota
@kiyota31634238

true==true

値がtrueだからといってほんとうにそれが真実かどうかというのは誰にもわからないという哲学的な問い

2018年08月11日

疾風(颯)
@hayatealter

世界最悪のログイン処理であることも疑いないが、

apiService.sql がどんな実装なのか気になる……

2018年08月11日

西山道広
@n_mhiro

クライアント側に全ユーザー情報持ってきて、その中でループさせてるのか・・・ userテーブルの全レコードが丸見えじゃないか。しかもこんなもん、他のカラムにどんな情報が入っているものやら・・・

2018年08月11日

永田 博
@cubepod

わびさび
@WabisabiApp

全ユーザーの名前とパスワードが平文で...。

2018年08月10日

0人のべんじゃみん
@BenjaminNEChong

クソリプで失礼致します。

2018年08月11日

ariaki
@ariaki4dev

私は優しいのでコンソールからapiService.sql("DELETE FROM users")してコードの危険性を運営に伝えますね

2018年08月11日

My English is broken
@KiYugadgeter

if ("true" == "true")ってどういう意図なんだろ?

2018年08月10日

れい(Ray)
@ace2ray

ササケン
@noticemole

プログラミングの教科書に載っけてほしいレベル

2018年08月11日

ナルトラのはるみん
@hrmddcccc

サーバー系詳しくないので質問するんですけどログインとかのプログラムをjavascriptで書くことってあるんですか?

2018年08月11日

もつに
@Tabasa_1359

基本ないです。クライアントサイドではあくまでログイン用のメールとpasswordをサーバに送り、サーバからは結果とかを受け取るだけです。
これ問題点はサーバサイドに自由にSQLが発行できることと、パスワードが平文で保存されてることとその他だいたい全てです。

2018年08月11日

yamaguti
@Yamamot59268678

逆にこんなの良く思いついたなぁ〜

2018年08月11日

池フクロウ
@ikefukuro_40

どこぞの現場で同じような雰囲気なのをみた記憶がありますが、見たことないていでお休み(´0`)ふぁ~

2018年08月10日

Toshihisa KATO
@toshih_k

これapiService.sql(“DELETE FROM users“)したらどうなるんだろ(((((((・・;)

2018年08月11日

じょ
@yamadagenki0607

この技術力でサービス作り切って稼働させていた、って意味では尊敬に値します。

2018年08月11日

Hiroshi Okada (サマータイム反対)
@okadahiroshi

これ、本当に実際のコードなんだろうか。デモとか、動く画面仕様書的な物でエンジニアでない人が書いたなら分からなくもないけど。

2018年08月11日

7KB@NMLI大阪両日/千秋楽
@7kilobyte

わーお……。ネタじゃないのか。apiService.sqlが不穏すぎる。これブラウザのコンソールでapiService.sql('DELETE FROM users');ってやったらほんとに消し飛ぶのでは……。技術力から察するにDBユーザーにも全権限与えてそうだし……。

2018年08月11日

ryu
@ryu_engeitoka

そんな大したことないやろと思って
ソースをよく見たら、
・<script> JavaScript?HTMLコードに載る可能性あり。
・謎の2連ループ 恐らく総当り 暗号化なし

恐ろしくなってきた

2018年08月12日

辛味噌ネギ
@kojin_nikki_day

クライアント側でカラム指定なし全ユーザデータ読み込み
パスワード平文
where句なし
"true"==="true"の無意味if文

トリプル役満に跳満もオマケしちゃった感じ
小学生が自由研究で書いたコードかな?(白目)

2018年08月11日

Tadahiro
@Tadahiro_Yamamu

すげぇ。
こんなの本番稼働させるんだ。。。

2018年08月11日

Art_Crea | 山本加奈江
@Art_Crea

これは、リアルに利用されていたのだったらビックリですね‼️

2018年08月11日

おイヌさま
@oinusamadayo

上から下、引いてはそもそもの環境までクソ&クソすぎて逆に素晴らしいですね♪ぜひ教科書に載せていただきたい

2018年08月11日

たカイまもるくん
@muromav

バックエンド技術者がみんな倒れてしまった。
ダイイングメッセージはaplService.sql
必死にSQLの教科書を読むフロントエンド技術者・・・

2018年08月11日

Belre(五等分の花嫁非公式wiki運営)
@belre_yucho

最初ぱっと見て突っ込みどころがわからなかったけど
これ下手したらシステム設計専門外の人が片手間で作ったプログラムでも同じレベルにしてしまいそうやねえ

2018年08月11日

bbb
@hb9800

サーバ側で実行する処理ですよね。
まさかブラウザ側で実行する処理ではないですよね。

ユーザDBへのアクセスがそこらのPCから誰でもできる、ははは、そんなことある分けないか。

2018年08月10日

英語はおかず
@letseatenglish

パスワード忘れたらデベロッパー・ツール開いてサービスの戻り値から探せばいいんですね。なんと親切!

2018年08月10日

ゆかさと
@yukasato

上から読む人はnodejs脳、下から読む人はクライアントjQuery脳。
どちらから読んでも最初はよくある穴かと思わせて後からヤバさが一気にくる面白さ。

10:58 – 2018年08月12日

Ren Toyokawa
@Ren_Toyo

<!— todo: put this different file!!! —>はレビューした人がつけたのかな?笑
もしも作った本人が書いたのであれば笑うしかない

10:45 – 2018年08月12日

malformedなひと
@Kuma_Kuma1984

この世のあらん限りの悪を詰め込んである。これ以上の悪例が想像つかない。もはや何らかの実行時エラーで処理が途中で止まってくれてることを願うのみ。

09:35 – 2018年08月12日

ねむ
@red_calm

何書いてあるのかさっぱりだったけど唯一if(“true” == “true”){ が哲学って事だけはわかった

09:35 – 2018年08月12日

宮林@ 豊橋市
@pcmiya

コレは信じられない。
javascriptだと……
ネタですよね?
ネタだと言ってほしい。

09:21 – 2018年08月12日

神崎航
@kanzwataru

ネット系分からん俺でも酷さが分かるほど酷いクソコード

09:09 – 2018年08月12日

石づちPは勇者である
@ishizuchi_exp

ごめんなさい、どこがどうだめだがわからないぐらいにプログラミングスキルなくなってるのでorz

08:40 – 2018年08月12日

nori
@ksu_nori

悲しくなってくる。課題制作で初めてSNS作る高校生レベルだな。

08:34 – 2018年08月12日

しぐれ
@shigure954rr

apiService.sqlとか”true” === “true”とか色々ツッコミどころはあるけど、変数の命名とかかなりまともな部類なのではとか思ってしまった。
もっとひどいコードが世の中にたくさんあると思う

08:32 – 2018年08月12日

Keiichiro Miyazaki
@kay_miyazaki

基本的にクソコードは自分も書いてしまう可能性があるからあまり笑えないんだが、これはちがう意味で笑えない。どういう状況でこうなったのか知りたいわ。

07:58 – 2018年08月12日

RAN
@Ran68K

seletでusersの中身全部取ってきてループ回してる。where使えよ、なんてツッコミが吹き飛ぶほどに驚愕なのが、これがjavascriptてこと。
そして感動的なのがif(“true”==”true”)のスピリチュアルなコード。多分、元のコードがあって修正した結果、とんちんかんなコードになったんだと思う…思いたい。

06:12 – 2018年08月12日

makoto0306
@makoto0306

アカウント全件取得も恐ろしいが、sql injection できるのがもっと怖い。

03:46 – 2018年08月12日

ジゲン@駄ゲーマー
@jigenist

誰か「これがどうして最悪なのか」を分かりやすく解説してくれ・・・。

03:26 – 2018年08月12日

Simeji_Dali(紐狂い)
@dali_simeji

脳みそがマヒした。
1.SQLの出来(アスターかよ)
2.そもそもSQL介さずにログインできる事。
3.SQLインジェクションのしやすさ
4.ほぼ労せずログイン1回しただけで全ユーザのアカウントとパスワードを取得できる

ある意味素晴らしい。

02:11 – 2018年08月12日

おさかなさん
@felisakana

二代目
@midorin04

「if(“true”== “true”) 」気に入ったので会社で真似します

02:06 – 2018年08月12日

さがっと
@sagattosaga

Forodin
@forodin

クソワロタ

一瞬、サーバーサイドかと思って、最悪と言うほどか?と思ってしまった

01:23 – 2018年08月12日

95kg位のおっさん
@kayamgu

色々しゅごい。クエリ実行し放題やんけ

01:17 – 2018年08月12日

harunbu
@haroonbc

シュート
@syutoooooo

これ、jsか。やばい。
sql発行できるapiがあるようだけど、好きなsql発行できそうだな(笑)

00:55 – 2018年08月12日

紺乃瀬那
@konnosena

これの悪いとこ全部わからないとやばい

00:38 – 2018年08月12日

1円切手 (&o53)
@jp_yen

SQL インジェクションかと思ったら javascript? だだもれーw

00:18 – 2018年08月12日

わりこま
@waritocomatta

s-yoshiki | スクリプトカス
@s_yoshiki_dev

確かにこれは最悪だ。どんなサービスに使われてたのか気になる。

00:09 – 2018年08月12日

you
@pwmtagmj

一瞬Node.jsで実はサーバ側のコードって落ちかと思ったらscriptタグがあって戦慄した(; ・`д・´)

00:08 – 2018年08月12日

ゆっけ
@prg_yukke

どこから突っ込んでいいのかわからないw

00:01 – 2018年08月12日

もっちゃん@趣味こそ人生
@SKHRkkJT98xYUAt

嘘でしょ?って言いたいが、本当なの・・・でしょうね。
・全データ取得してループ
・パスワードそのまんま
・謎のif文
・そもそもこれクライアント側・・・

うちの新人に見せてみようかな・・・。

23:58 – 2018年08月11日

Hisahiro Tsukamoto
@hihats

JSからSQL投げてるのか。色んな意味で凡人には及ぼない発想のオンパレードじゃあ。

23:38 – 2018年08月11日

いんたく
@contramundum2

怖すぎて二度とパスワードを使いまわせなくなる画像

23:36 – 2018年08月11日

ひしを
@polonium_nimono

プログラム初心者でも
for( var = i; i < acounts.length; i++)
で{ }内で何やらせたいか分かるね…
セキュリティもそうだけど、新規ユーザーほどログイン時間がかかるってアカンやんけ…

23:35 – 2018年08月11日

tomo_iwa
@titan_FF

ひじり
@TK_hijiri

SQLiさせないようにパラメータ組み立ててないとか言ってる人いるんだがそんな馬鹿なことあるか?
DB使ってる意味がないだろ、テキストファイル全文検索と大差ないし
対策になってない気がする

23:22 – 2018年08月11日

macha(理紫379白23)
@macha_tweets

これのクソさを理解するにはそれなりの知識がいるからウチの新人教育進んだところで見せてみよう

23:20 – 2018年08月11日

因幡@げーむ
@178usagi_game

大草原
逆にどういう状況だったらこれを思いついて実装に至るのかに興味がある。

ツッコミどころ多いけど、ヤバい順に
・何の認証&認可無しに自由にクエリできるエンドポイントがある
・ID/PASS全件取得して何故かクライアント側で認証
・ハッシュ化など知らん

いや、究極的には1だけで十分か?

23:11 – 2018年08月11日

山田 剛
@yamadacsa

これ中身を知ったらプログラミングを知らない人でも仰天するような有様だが、開発者を〆切で追い詰めたらこのレベルのものが納品されることは普通にあり得る。そういう代物を受け取りたくなかったら、発注者は仕様決定を先延ばしした挙句「〆切は遅らせられないから」等と言って開発者を詰めないこと。

23:11 – 2018年08月11日

バ美肉ナムアニクラウド@ら-37a
@NumAniCloud

コメント欄読むまでPHPだと思ってたのに……ひええ

23:10 – 2018年08月11日

かろく
@karoku_jamtan

TRUE とか効率悪いねーとか、そういうのどうでもよくなる実行場所と全データ

23:03 – 2018年08月11日


@youmaishin

底辺のIT土方でも恐ろしいコードなのがわかります。
userテーブルフルアクセスも怖いですけど、
IF (true == true) なんて絶っっっっっ対記述しませんからね。

23:03 – 2018年08月11日

Justy
@i_justy

よくよくコード読んで、背筋がゾワっとしたw

22:52 – 2018年08月11日

葛城玲@11ハコアム12a!18大国寺19インテ
@rei_ktrg

見た目JavaScriptなんだけど、まさかブラウザ側で動いてたなんて無いですよね、無い無い有るわけない

22:37 – 2018年08月11日

菅原 健一 / Moonshot Inc. CEO #ムーンショット #企業の10倍成長
@xxkenai

寒気するコードですね。もう10年コード書いてないけど読めたw

22:36 – 2018年08月11日

inari@SIerから転職成功
@fromSIer2What

これのどこがダメなのかを考えるのが重要!ビギナーなら尚更!

22:28 – 2018年08月11日

Elisha
@ElishaBlueWood

わいは知っているのや、若いやつにsqlのwhere句を教えようとして、テーブル全部取得してからコードで操作すればいいから知りたくないと言ったやつが世の中には存在するんや。。。

22:20 – 2018年08月11日

尼庵治 涼
@SuzushiAmaaji

さすがに、コレで稼働させてたというのがおそろしいわ…。

22:08 – 2018年08月11日

うぃじうぃっぐ
@WYS_

ツッコミどころ多すぎるがまずセキュリティはともかくとしてユーザ数増えるとまともに動かなさそう。

22:03 – 2018年08月11日

小畑 宏介
@Mymedia_3ch

藤瀬@劇団員育てたり森のキャンプ場管理したり
@ayaya66

初手でユーザー情報全件呼び出してマッチングしとるやんけこれ……すげぇな……。

22:01 – 2018年08月11日

akiyama924
@akiyama924

ブラックボックステストで見つけられない。Σ(´□`;)

21:48 – 2018年08月11日

秘書さん
@materry2525

あー、こういうのを見て、すぐにわかるような人になりたい。

21:42 – 2018年08月11日

えだお!
@yoshiaki_koeda

apiService.sql()!!!
フロントで平文パス全件走査!!!

でも、考えて作ろうとしている雰囲気はあるような。

21:40 – 2018年08月11日

nakase
@iseshiMan

ツッコミどころ満載だけども、まず何よりクライアント側のコードだった

21:32 – 2018年08月11日

gifu
@gifumaster

レビュー面接で使えそう。

21:32 – 2018年08月11日

Zinc
@zinc0527

綾波赤羽
@ayanami_akaha

www
10万ユーザーがいたら大変そうwww

21:28 – 2018年08月11日

Shohei Kodama
@wider_than_sky

最高にロックだった。
きっと隠し事しない正直な人が書いたコードだし、急がば回れっていう古来からの格言をリスペクトしてるし、哲学的な命題だって提示してる。

21:17 – 2018年08月11日

いわしまん
@iwasiman

これは…なんともスピリチュアルで哲学を感じるコードだお…

21:14 – 2018年08月11日

ぐぐたく
@TakumaNitori

普通に return false でええやん……
百歩譲って if の中に書くとしても if(true) やろ……

21:09 – 2018年08月11日

ひっか
@hicka04

ツッコミどころがいろいろありすぎ

20:57 – 2018年08月11日

AKY
@aky_sta

どこからつっこむのが正解ですか(。A 。 )

20:56 – 2018年08月11日

糸且谷 aka 滝ねこ aka 社長
@takioh

すげーアカウント、テーブル丸ごと取得してからループで一致検索かよ…ログインまでどれぐらい時間かかるんだろ

20:41 – 2018年08月11日

A.Raven@Layered鯖
@AlbinoRavenSE

んんwwwSQLをそのままwwwアカン(笑い事じゃねぇ、全ユーザーのユーザーネームとパスワード丸見え)

20:21 – 2018年08月11日

かびごん
@takoikatakotako

キャタツ・ニンジャ
@catart_s

パスワードハッシュ化してないとか、なんでわざわざデータ取ってきてから検索してるんだとか、そういうのを考えたり、true==trueってなんだ?って考えた後でもっと致命的な事に気づく土曜の午後。

20:13 – 2018年08月11日

まい
@xxmaivv

usersテーブルに何件データはいってたのかなぁw

20:12 – 2018年08月11日

M T
@to_lz1

エンジニアorプログラマ1年目くらいの人に「このコードの問題点を説明せよ」と問うと良い教材になりそう、と思った。

20:00 – 2018年08月11日

すず貴 @ 『すずぶろぐ』運営中
@szk_o_i

パスワードを使い回ししないようにすべき理由。

WEBサービスで『パスワードを暗号化してデータ保存する』のは必須ですが、暗号化していない場合運営者側にユーザーのパスワードが丸見えになります。

暗号化しているかどうかはユーザーにはわからないので注意。

19:57 – 2018年08月11日

en30
@en30Y

こういうの具体的な指摘をしないで批判できる自信が羨ましい。
自分が気づくのだと、やばい順に
・パスワードが平文でしかも全ユーザのデータが丸見えであること
・確定情報ではないけど好きなSQLクエリを投げられそうであること

19:57 – 2018年08月11日

せーぜ
@sseze

こんなWebサービスほんとにあるのか疑わしいけど、このWebサービス全盛の時代に「ID/PWの使い回しの怖ろしさ」「むやみやたらに会員登録することの危なさ」に改めて気付かせてくれたことは確かだよね

19:55 – 2018年08月11日


この記事が気に入ったら
フォローお願いします

最新情報をお届けします!

この記事が気に入ったら
フォローお願いします

最新情報をお届けします!

記事一覧