前提・実現したいこと
C#を用いて、データーベース(PostgreSQL)の更新、削除などを行っています。
その際SQLインジェクション対策をしたく、色々と調べてみたのですがいまいち理解できなかったため
質問させていただきます。
該当のソースコード
C#
1using System; 2using Npgsql; 3namespace C 4{ 5 class Data_Select 6 { 7 public Select(string storage) 8 { 9 //接続文字列 10 string conn_str = "Server=111.111.11.111;Port=5432;User ID=postgres;Database=111;Password=111;Enlist=true"; 11 using (NpgsqlConnection conn = new NpgsqlConnection(conn_str)) 12 { 13 conn.Open(); 14 NpgsqlTransaction tran = conn.BeginTransaction(); 15 string sql = @" select * FROM syain WHERE id =" + storage + ";"; 16 NpgsqlCommand cmd = new NpgsqlCommand(sql, conn); 17 using (NpgsqlDataReader dr = cmd.ExecuteReader()) 18 {} 19 conn.Close(); 20 } 21 } 22 } 23} 24
試したこと
C#
1using System; 2using Npgsql; 3namespace C 4{ 5 class Data_Select 6 { 7 public Select(string storage) 8 { 9 //接続文字列 10 string conn_str = "Server=111.111.11.111;Port=5432;User ID=postgres;Database=111;Password=111;Enlist=true"; 11 using (NpgsqlConnection conn = new NpgsqlConnection(conn_str)) 12 { 13 conn.Open(); 14 using (NpgsqlCommand command = new NpgsqlCommand(@" select * FROM syain WHERE id = :value1", conn)) 15 { 16 command.Parameters.Add(new NpgsqlParameter("value1", NpgsqlDbType.Integer)); 17 command.Parameters[0].Value =int.Parse(storage); 18 //command.Parameters[1].Value =int.Parse(storage1); 19 //command.Parameters[1].Value =int.Parse(storage2); 20 //ここに一個一個挿入する値を書く? 21 //クエリ実行 22 using (NpgsqlDataReader dr = command.ExecuteReader()) 23 {} 24 conn.Close(); 25 } 26 } 27 } 28}
とあるサイトを参考に書いてみて実行も出来たのですが、これでSQLインジェクション対策はできているのでしょうか?
いろいろ調べられたそうですが、どういったページを調べて何が分からなかったのでしょうか?
例えばstorageに『1 or 1=1』という値をいれるとSQLはどうなって、その実行結果がどうなるか理解できていますか?
調べて出てくる内容では何が足りなかったのでしょう。
「SQLインジェクション」という絶対的なキーワードをご存じなのであれば、この質問内容を書いている間に調べて試せる範囲ではないでしょうか。
プロバイダによって SQL インジェクション防止対策は違ってくるようですが、何にせよ以下のように SQL 文をユーザー入力で組み立てるということは最もやってはいけないことには間違いないです。
string sql = @" select * FROM syain WHERE id =" + storage + ";";
あとは「C# PostgreSQL sql injection」などをキーワードにググって自助努力で調べてください。それでどうしても分からないことがあれば、その URL を示して、その記事のどこそこが分からないから教えてほしいというような質問にすることをお勧めします。
回答1件
あなたの回答
tips
プレビュー