みなさんこんにちは!
フリーランスプログラマーのsatoです。
今回は「SQLインジェクション」について、初心者向けに、非常に簡単に見ていきましょう。
私の関わってきたプロジェクトでの体験談もありますので、参考にしてみてください。
それではよろしくお願いいたします。
「SQLインジェクション」とは
インジェクションとは和訳すると「注入・挿入」という意味です。
SQLを流し込む悪い行為…
そう考えるとイメージがつきやすいのではないかと思います。
SQLインジェクションを一言でいうなら「Webアプリケーションの脆弱性をついて、SQLをデータベースで実行させる行為」といったこところでしょうか。
例えばどんな風に発生するの?
例えば一番簡単に起こり得る内容で説明しましょう。
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さえ指定してしまえば、誰でも好きなアイテムが取得できる状態になっていたということです。
発見され次第すぐに修正を行いましたが…
しばらくリリースされており、ユーザー間でそんな噂もうっすらあったため、少しの間悪用されていた可能性もあります。
恐ろしい話ですね…
実際こういった問題は、他人事ではなく、実際大いに起こり得る話です。
開発者の方は、送られてきたデータを鵜呑みにせず、必ずチェックを行うようにしましょう。
そもそものサーバーの脆弱性をつかれることも
先ほどまでは、開発の視点からSAQLインジェクションを見てきました。
しかし自分が開発で起こさなくとも、そもそものサーバーの脆弱性を突かれることも大いにあるわけです。
例えば「ソフトのバージョンが古い」「設定が悪い」こういった理由でSQLが流せる状態になっている可能性も大いにあるわけですね。
どう対策すればいいの?
開発の側面から
パラメーターとしてユーザーから受け取った情報は、改ざんされている可能性が少なからずあります。
SQL云々に限らず、チェックをせず使用しないように気をつけましょう。
サーバー管理者の側面から
様々な問題が常にはびこっているため、完全に防ぐことは難しいでしょう…
そのため明確な答えもありません。
しかしバージョンを最新に保つことや、動向に目を走らせておくこと。
操作されても、すぐに発見できるように対策しておくこと。
などなど、できる対策は無数にあります。
つねに脆弱性と戦っていく必要があるでしょう。
まとめ
今回はSQLインジェクションについて見てきました。
正直、完全な対策方法はありません。
しかし極力発生しないように対策し続けることは可能です。
データベースで顧客データをあつかっている場合などは、絶対に気をつけていきましょう。