【解決方法】テキストボックスから引用符付きのテキストを保存してデータベースにアクセスする方法


やあみんな、
ユーザーがフォームにテキストを入力できるアプリケーションを開発しています。
そこで私はテキストボックスを使います。
テキストボックスに含まれるデータを Access データベースに保存できますが、テキストに一重引用符 (‘) または二重引用符 (“) が含まれていると問題が発生します。

どうすれば問題を解決できますか?

ありがとう

精度: C# のデスクトップ アプリケーション WinForm です。

私が試したこと:

SQL コマンドに引用符が表示され、データとしてではなくコマンドの一部として解釈されるため、Texbox1.Text の使用は機能しません。

ここにコードがあります

OleDbConnection 接続 = new OleDbConnection(@”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Historique_Rdv.accdb”);
接続.Open();

文字列コマンド = “INSERT INTO RendezVous ” +
“(IDAnimal, AppointmentNumber, AppointmentDate, Service, Time, ComplementInfo, Pay, OwnerID) ” +
“VALUES(” + int.Parse(TB_idAnimalNewRdv.Text) + “, ” + int.Parse(TB_numeroRdvNouveauRdv.Text) + “, ‘” + TB_dateNouveauRdv.Text + “‘, ‘” + TB_actionNouveauRdv.Text + “‘, ‘ ” + TB_tempsNouveauRdv.Text + “‘, ‘” + TB_complementInfoNouveauRdv.Text + “‘, ” + int.Parse(TB_payeNouveauRdv.Text) + “, ” + int.Parse(TB_idProprietaireNewRdv.Text) + ” )”;

OleDbCommand cmdd = 新しい OleDbCommand(コマンド, 接続);
cmdd.ExecuteNonQuery();

接続.Close();

解決策 2

引用:

テキストボックスに含まれるデータを Access データベースに保存できますが、テキストに一重引用符 (‘) または二重引用符 (“) が含まれていると問題が発生します。

これはおそらく、テキストを保存しようとしている方法に関連しています。
SQL インジェクションの脆弱性について読む必要があります。

文字列を連結して SQL クエリを作成しないでください。 遅かれ早かれ、ユーザー入力を使用してこれを実行することになり、これにより「SQL インジェクション」と呼ばれる脆弱性への扉が開き、データベースにとって危険であり、エラーが発生しやすくなります。
名前に一重引用符が含まれているとプログラムがクラッシュします。 ユーザーが「Brian O’Conner」のような名前を入力するとアプリがクラッシュする可能性がある場合、それは SQL インジェクションの脆弱性であり、クラッシュは最も問題の少ない悪意のあるユーザー入力であり、すべての資格情報を持つ SQL コマンドに昇格されます。
SQL インジェクション – ウィキペディア[^]
SQLインジェクション[^]
SQL インジェクション攻撃の例[^]
PHP: SQL インジェクション – マニュアル[^]
専門用語を使わずに SQL インジェクションを説明するにはどうすればよいですか? – 情報セキュリティスタック交換[^]

解決策 3

現在のコードが機能しない理由は、文字列連結を使用して SQL INSERT クエリを構築しているためです。 これは絶対にやめてください!!!

代わりにパラメータ化されたクエリを使用してください。 こうすることで、テキスト内の二重引用符が SQL ステートメントの一部として解釈されるのではなく、適切にエスケープされます。

解決策 2 のリンクを読み終えたら、Google で「C# SQL パラメータ化クエリ」を検索して、質問のパラメータ オブジェクトを作成し、SQL ステートメントにパラメータ プレースホルダを配置する方法に関する情報を見つけます。

ああ、これを行うと、SQL コードのデバッグもはるかに簡単になります。

コメント

タイトルとURLをコピーしました