異世界で名前をhoge');INSERT INTO role (name,role) VALUES ('hoge','god');--にしたら神になれた

七瀬

第1話 俺の名は

am 0:23


To XXXさま

Cc XXXさま、XXXさま


いつもお世話になっております。XXX株式会社のXXXです。

本日発生していた XXXXX_1277 打ち消し伝票の更新処理で遅延が発生する 件ですが裏でバッチ処理が実行された際に SELECT FOR UPDATE の絞り込み条件が甘く、余計な伝票も含めて行ロックが行われ、その行ロックに衝突することで生じた遅延のようです。


該当バッチのSQLを修正してプルリクエストを投げておきましたので、ご確認のほどよろしくお願いします。




 やれやれ。XXXの尻拭いのデバッグで午前様とはやってらんないなあ……。この時間じゃ電車は間に合わないし。自宅まで3駅分歩くとするか? さっきから目がチカチカして限界。眼精疲労が限界に近づくとふらついて気持ち悪くなってくる。あとは頭痛。さっきからやけにズキズキしやがってこんちくしょう。ダメだ。ちょっと仮眠とっていった方がいいかあ?


 誰もいない深夜のオフィス。俺は長椅子に横たわる。ああ。頭が痛い。ちょっとこれは酷いんじゃないか。でもまあ、きっとひと眠りすればなんとかなるさ。なんとかな……る……。


 少しだけ。少しだけ眠って……。次のタスクはなんだっけ。リリースまでもうひと頑張りしなくちゃな……。


§


 眩しい――。瞼を閉じていてもわかるこの明るさ。朝……? いや、もっと眩しい。何時……? 昨日は確か……


 ガバッ


「やべっ。寝落ちしたっ!」


 跳ね起きると、そこはただ何もない白い世界だった。これは……夢……? そうか。ここんところ深夜作業が続いていたものな。金縛りとか変な夢を見たりとか、そういうのはままあることだ。睡眠障害の類だ。ちょっとここんところ根を詰めすぎていたな。


 起きたつもりでまだ寝ている。あるある。これは相当に疲労していて、かつ、神経が昂っているようなときになるやつだ。そうに違いない。


 ―― Enter Your Name ――

  【|    】


 なんだ。ゲームか? まあそういう夢もあるだろ。俺みたいな底意地の悪いプログラマというのはこの手の UIユーザーインターフェースを見たら、バグがないか叩いてみる習性がある。これはある種の職業病といっていいね。まあ今どき初歩的なセキュリティホールがあるとも思えないが試すだけ試してみたくなるものさ。


 hoge');INSERT INTO role (name,role) VALUES ('hoge','god');--


 これはSQLインジェクションという奴だ。例えるなら、そうだな。学校のテストで穴埋めの問題の空白に、ような感じだ。


名前を入れた際にデーターベースのユーザーテーブルにレコードが作られる。その際のSQLは例えば次のようなものになるだろう。


 INSERT INTO users VALUES (' 【   】 ');


 これは users テーブルのnameを【   】の値でレコードを作るという意味合いだ。文字列は ' ' で囲う。ここで名前の【   】の部分に文字列の終わりを示すはずの 「'」 と括弧閉じ「)」そして文末を意味するセミコロン「;」その後ろに別のSQLコマンドを含めると


 INSERT INTO users VALUES (' 【hoge');INSERT INTO role (name,role) VALUES ('hoge','god');--】');


 これは

 1) INSERT INTO users VALUES (' hoge');

 2) INSERT INTO role (name,role) VALUES ('hoge','god');

 3) --');

 に分けられ、最初の1)はユーザー'hoge'を作る、2) は 'hoge' に 'god' の役割(つまり神だ!)を与える、という意味合いになる。2) の部分がテストの穴埋め問題の例えで言ったというわけだ。3) の -- から始まる文はコメントを表し、プログラムとして解釈されない。本来この後に続くSQLがあったとしても、それらをなかったことにしてしまい、構文が異常になることを防ぐ。


 まあ、実際にはSQLインジェクションなんて攻撃はこてこての古典で、ド素人がシステムを作ってるのでもなければ今どきは生じることはまずない。駆け出しITエンジニアが研修段階あたりでやらかして先輩にたしなめられる、そんな段階で叩き込まれる初歩の初歩といえるセキュリティ対策といえよう。


 ほんの冗談、あいさつ代わり。こんなの通るわけないでしょ。そう思いつつもこのこてこての古典の攻撃を試さずにいられない辺りがプログラミングオタクが高じて職業プログラマになっちゃったタイプの俺らしさである。


―― From the New World ――


 新世界より……?


―― Dear, hoge ――


 ぅぉおおい! しれっと通ってるんじゃねえ! なんだこいつは! ド素人の学生が趣味で作ったMMOじゃあるまいな?!


 深夜残業の寝落ちからの、金縛りで起きれないで見ている夢の中でセキュリティチェックをやって遊んでしまう自分の愉快さに呆れつつも、そろそろ真面目に起きないといけないか。そんなことを考えていた。



----------

SQLというのはデーターベースを操作するための呪文のようなものです。


作中にあるようにSQLインジェクション攻撃は初歩の初歩といえる攻撃手段で、データーベースにアクセスするためのSQL文を、単純な文字列連結で編集していると生じてしまいます。


Statement statment = con.createStatement();

ResultSet rs = statment.executeQuery("INSERT INTO users VALUES ('"+name+"');");


これはexecuteQuery()で実行するSQLを + による文字列連結で行っているダメな例です。(言語はJavaで部分抜粋)


これに対して推奨されるのは以下のように"?"でパラメータを渡す場所を示す方式です。


PreparedStatement ps = con.prepareStatement("INSERT INTO users VALUES (?);");

ps.setString(1, name);

ResultSet rs = ps.executeQuery();


現代ではプログラム言語とそのライブラリによってSQLインジェクションを起こさない安全な方法が提供されていますから、このあたりの基礎的なことを知らない人が作らない限りはSQLインジェクションという古典的なアタック手法は成立しません。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る