SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

伏石ちゃんは意図に反したい

なかなか撲滅できないSQLインジェクション、その原理と対策を知る【伏石ちゃんは意図に反したい】

FILE 0x0A: SQLインジェクション

対策方法

充希
どうやって対策すればいいんでしょうか?
先生
文字列結合とか置換とか、単純な文字列編集でSQL文を組み立てないことだ
充希
そんなことって可能なんですか?
先生
バインド機構を使ってプレースホルダーに値をセットする方法が定番だな。こんな風な感じだ

 例えば、C#による記述方法を見てみましょう。

using Microsoft.Data.Sqlite;
using System;

namespace sample;

class Program
{
    static void Main(string[] args)
    {
        using var conn = new SqliteConnection("Data Source=:memory:");

        conn.Open();
        
        using var create = conn.CreateCommand();
        create.CommandText = "CREATE TABLE Test (id INTEGER PRIMARY KEY AUTOINCREMENT, kana VARCHAR(128));";
        create.ExecuteNonQuery();

        
        using var insert = conn.CreateCommand();
        insert.CommandText = "INSERT INTO Test (kana) VALUES ($kana);";
        insert.Parameters.AddWithValue("$kana", "'--')/ヨッ");
        insert.ExecuteNonQuery();


        using var cmd = conn.CreateCommand();
        cmd.CommandText = "SELECT * FROM Test WHERE kana = $kana";
        cmd.Parameters.AddWithValue("$kana", "'--')/ヨッ");
        var reader = cmd.ExecuteReader();

        while(reader.Read())
        {
            var id = (long)reader["id"];
            var kana = (string)reader["kana"];

            Console.WriteLine("id = {0}, kana = {1}", id, kana);
        }

    }
}

 ここで、バインド機構を使用しているのは以下の箇所です。

        insert.CommandText = "INSERT INTO Test (kana) VALUES ($kana);";
        insert.Parameters.AddWithValue("$kana", "'--')/ヨッ");
        cmd.CommandText = "SELECT * FROM Test WHERE kana = $kana";
        cmd.Parameters.AddWithValue("$kana", "'--')/ヨッ");

 ここで$kanaがプレースホルダです。そこに'--')/ヨッという値を当てはめるのがバインド機構です。ここではParametersにセットされた内容が、SQL実行時に当てはめられて実行されます。

 実際に実行してみると、正常に'--')/ヨッの値がテーブルに挿入され、検索条件にも使用できていることが確認できます。

PS C:\hoge\sample> dotnet run
id = 1, kana = '--')/ヨッ
PS C:\hoge\sample> 
充希
文字列を置換しているだけでは?
先生
いや、それが違うんだ。検索クエリを文字列置換に変えてみよう
        cmd.CommandText = "SELECT * FROM Test WHERE kana = '$kana'".Replace("$kana", "'--')/ヨッ");
        var reader = cmd.ExecuteReader();
先生
そうする結果はこうなる
PS C:\hoge\sample> dotnet run
PS C:\hoge\sample> 
充希
何もヒットしない

 このように、単純に文字列置換が行なわれるわけではありません。

 実行されるSQL文とは別にDBに値が渡されるため、'--')/ヨッというような特別な意味を持つ記号が含まれていても異常動作を引き起こさないのです。

先生
他にも、O/Rマッパーを使用するという手もある。それならSQLの生成自体もO/Rマッパーが行なってくれるから、そもそもSQL文を直接書く必要すらないんだ
充希
……そんな便利なものがあるなら、とっくに撲滅できるはずなのに
先生
それが良し悪しなんだな。SQLを書かなくてもDBを操作できる、言い換えれば、SQLインジェクションの知識がない人が多い。パフォーマンスチューニングで急にSQL文を書かされて、脆弱性を作り込んだりするんだ
充希
なるほど
先生
長らく事故がおきなければリスクは軽視されがちだ。改めて認識される切っ掛けが'--')/ヨッ程度で良かったじゃないか
充希
……はい

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

井二 かける(イブタ カケル)

 情報処理安全確保支援士、プログラマー、作家。「物語の力でIT・セキュリティをもっと面白く」をモットーに、作家活動、セキュリティ啓発活動を行う。主な作品はアニメ「こうしす!」、小説「こうしす!社内SE祝園アカネの情報セキュリティ事件簿」(翔泳社)、マンガ「伏石ちゃんは意図に反したい ~ハッキングから始まる高校生活~」(京姫鉄道出版)など。 Twitter:@k_ibuta@kyoki_railway

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山口 しずか(ヤマグチ シズカ)

 やりたいことはなんでもやる精神で急成長中の漫画家。2019年よりマンガアプリにて商業連載デビュー。連載の傍ら企業のPR漫画や漫画動画など媒体・ジャンルにとらわれず時代に合わせた漫画を制作中。趣味はお酒と旅行。 Twitter:@shizuckey

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/16179 2022/07/22 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー