通常のステートメントは機能するのに、MySQL での C# プリペアド ステートメントが失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-11-16 15:32:03
オリジナル
299 人が閲覧しました

Why Does My C# Prepared Statement with MySQL Fail, But a Regular Statement Works?

MySql を使用した C# のプリペアド ステートメントの問題のトラブルシューティング

C# プログラムでプリペアド ステートメントを実装する際につまずきます。通常のステートメントに移行すると、コードはシームレスに動作するため、戸惑うことになります。この矛盾の背後にある潜在的な原因を調査してみましょう。

指定したコード スニペット内:

cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND admin_password=PASSWORD('@val2')", MySqlConn.conn);
//cmd.Prepare();
//cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
//cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='"+tboxUserName.Text+"' AND admin_password=PASSWORD('"+tboxPassword.Text+"')", MySqlConn.conn);
ログイン後にコピー

主な違いは、SQL クエリでの一重引用符 (' ') の使用にあります。プリペアド ステートメントはパラメーター プレースホルダー (@val1、@val2) を利用して SQL インジェクション攻撃を防ぎます。通常のステートメントを使用する場合は、クエリ自体内で一重引用符をエスケープする必要があります。

この問題を解決するには、次のようにコードを変更することを検討してください。

cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username=@val1 AND admin_password=PASSWORD(@val2)", MySqlConn.conn);
cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd.Prepare();
ログイン後にコピー

から一重引用符 ' を削除します。クエリを実行し、パラメーターを追加した後に cmd.Prepare() を使用すると、準備されたステートメントが機能することを確認できます。このアプローチにより、コードが悪意のあるインジェクションから保護され、セキュリティが強化されます。

以上が通常のステートメントは機能するのに、MySQL での C# プリペアド ステートメントが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート