SQLインジェクションとは?ソシャゲ開発者視点からみるサーバー攻撃

50種類以上のIT教材を無料で使える!
0円から学習できるオンラインITスクール「侍テラコヤ」
→さっそく登録する

みなさんこんにちは!

フリーランスプログラマーのsatoです。

今回は「SQLインジェクション」について、初心者向けに、非常に簡単に見ていきましょう。

私の関わってきたプロジェクトでの体験談もありますので、参考にしてみてください。

それではよろしくお願いいたします。

「SQLインジェクション」とは

インジェクションとは和訳すると「注入・挿入」という意味です。

SQLを流し込む悪い行為…

そう考えるとイメージがつきやすいのではないかと思います。

SQLインジェクションを一言でいうなら「Webアプリケーションの脆弱性をついて、SQLをデータベースで実行させる行為」といったこところでしょうか。


【なかなかエラーが解決できない…そんな悩みを解決します!】

登録無料で始められるプログラミングスクール「侍テラコヤ」

・回答率100%のQ&A掲示板でエラーを解決!
現役エンジニアとのオンライン相談で悩みを解決!
・50種類以上の教材で複数言語を習得!

侍テラコヤについて詳しく見る

例えばどんな風に発生するの?

例えば一番簡単に起こり得る内容で説明しましょう。

Webサービスの開発などに関わったことがある人ならばわかると思いますが…

POSTやGETでデータのやりとりを行うことも少なからずあると思います。

仮にこのデータを、直接(もしくは間接的に)データベースのSQLに使っていたとしたらどうでしょうか。

https://xxxxx.xxx/xxxxx.php?user_id=10001

例えばこんな風に受け取ったデータを…

$sql = "SELECT * FROM user WHERE user_id=" . $_GET['user_id'] . ";"

※例としてPHP式形式で書いています。

そのままこんな風に、SQLにデータを使用していたら…

ユーザーは好きにURLを書き換えて、任意のSQLをデータベースへ流しこめる状況になってしまいますね…

[実録]ソシャゲでのアイテム増殖事件

これは実際にあった話ですが…

昔仕事でソーシャルゲームの開発に関わっていた時、新人の子が先ほどと同じような処理を書いて、リリースしてしまっていたことがありました。

https://xxxxx.xxx/item_get.php?item_id=10001

ちょうどこんな形式で、item_idを送れるようにしていたんですね。

$sql = "INSERT INTO item(item_id,〜〜〜〜〜)VALUES(" . $_GET['item_id'] . ",〜〜〜〜〜);"

※SQL文が適当なのは。あくまで例ということで…

そしてそれがサーバー側で受け取った後、このように特にチェックなくインサート文に使用されている状態でした。

item_idさえ指定してしまえば、誰でも好きなアイテムが取得できる状態になっていたということです。

発見され次第すぐに修正を行いましたが…

しばらくリリースされており、ユーザー間でそんな噂もうっすらあったため、少しの間悪用されていた可能性もあります。

恐ろしい話ですね…

実際こういった問題は、他人事ではなく、実際大いに起こり得る話です。

開発者の方は、送られてきたデータを鵜呑みにせず、必ずチェックを行うようにしましょう。


【なかなかエラーが解決できない…そんな悩みを解決します!】

登録無料で始められるプログラミングスクール「侍テラコヤ」

・回答率100%のQ&A掲示板でエラーを解決!
現役エンジニアとのオンライン相談で悩みを解決!
・50種類以上の教材で複数言語を習得!

侍テラコヤについて詳しく見る

そもそものサーバーの脆弱性をつかれることも

先ほどまでは、開発の視点からSAQLインジェクションを見てきました。

しかし自分が開発で起こさなくとも、そもそものサーバーの脆弱性を突かれることも大いにあるわけです。

例えば「ソフトのバージョンが古い」「設定が悪い」こういった理由でSQLが流せる状態になっている可能性も大いにあるわけですね。

どう対策すればいいの?

開発の側面から

パラメーターとしてユーザーから受け取った情報は、改ざんされている可能性が少なからずあります。

SQL云々に限らず、チェックをせず使用しないように気をつけましょう。

サーバー管理者の側面から

様々な問題が常にはびこっているため、完全に防ぐことは難しいでしょう…

そのため明確な答えもありません。

しかしバージョンを最新に保つことや、動向に目を走らせておくこと。

操作されても、すぐに発見できるように対策しておくこと。

などなど、できる対策は無数にあります。

つねに脆弱性と戦っていく必要があるでしょう。

まとめ

今回はSQLインジェクションについて見てきました。

正直、完全な対策方法はありません。

しかし極力発生しないように対策し続けることは可能です。

データベースで顧客データをあつかっている場合などは、絶対に気をつけていきましょう。

プログラミング学習中、
誰かへ相談したいことはありませんか?

SAMURAI TERAKOYA

プログラミングはエラーの連続。作業を進めるなかで誰かに教えてほしい場面は多いですよね。

そんな悩みを解決できるのが、侍テラコヤです。登録無料で始められて、現役エンジニアとオンラインで相談できるほか、回答率100%のQA掲示版でプログラミングに関する悩みを解決します!

気になる方はぜひ詳細をご覧ください。

→侍テラコヤの詳細をみる

Writer

sato

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close