質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

9131閲覧

C#のSQLインジェクション対策について

LOL_DESU

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/12/07 05:51

編集2020/12/08 02:24

前提・実現したいこと

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インジェクション対策はできているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/12/07 06:00

いろいろ調べられたそうですが、どういったページを調べて何が分からなかったのでしょうか?
sousuke

2020/12/07 06:06

例えばstorageに『1 or 1=1』という値をいれるとSQLはどうなって、その実行結果がどうなるか理解できていますか?
m.ts10806

2020/12/07 06:10

調べて出てくる内容では何が足りなかったのでしょう。 「SQLインジェクション」という絶対的なキーワードをご存じなのであれば、この質問内容を書いている間に調べて試せる範囲ではないでしょうか。
退会済みユーザー

退会済みユーザー

2020/12/07 06:28 編集

プロバイダによって SQL インジェクション防止対策は違ってくるようですが、何にせよ以下のように SQL 文をユーザー入力で組み立てるということは最もやってはいけないことには間違いないです。 string sql = @" select * FROM syain WHERE id =" + storage + ";"; あとは「C# PostgreSQL sql injection」などをキーワードにググって自助努力で調べてください。それでどうしても分からないことがあれば、その URL を示して、その記事のどこそこが分からないから教えてほしいというような質問にすることをお勧めします。
guest

回答1

0

ベストアンサー

とあるサイトを参考に書いてみて実行も出来たのですが、これでSQLインジェクション対策はできているのでしょうか?

パラメータ化クエリを使うように変更したのですね。

プロバイダによりますが、パラメータの入力はリテラルとして扱われるから SQL インジェクション攻撃を防ぐことができると言われています。

ただ、以下の Microsoft の記事に書いてあることですが、"高いスキルを持つ決然たる攻撃者は、パラメータ化されたデータであっても操作できるのです" ということですので、その記事に書いてある「すべての入力の検証」なども考えた方がよいと思います。

SQL インジェクション
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2008/ms161953(v=sql.100)

投稿2020/12/08 03:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/12/08 04:19

すべての入力の検証は大事ですね。 たとえば id が int になっていますが、int と解釈できない文字列、または対応できる範囲外の値になるものを送るとエラーが出る可能性があり、そのエラーメッセージからデータベースの内容を推察できるとすればそれは SQL インジェクションになると思います。 質問のコードは int.Parse を使っているので、まさにここで例外が発生する可能性があります。 また、入力の検証とともに例外をキャッチし、ログに書き込むという処理も必要になってくると思いますし、万全を期すなら、そもそも不正な入力をする人を排除する仕組みも欲しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問