対策方法
例えば、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に値が渡されるため、'--')/ヨッというような特別な意味を持つ記号が含まれていても異常動作を引き起こさないのです。
'--')/ヨッ程度で良かったじゃないか
