[ad_1]
string Users = "select UserId from Users where Name=" + User.Identity.Name;
私が試したこと:
実際、私が試したすべての解決策は成功しません
解決策 1
DB からデータをフェッチする SELECT ステートメントを使用して DB にデータを入れないでください。
新しいデータを追加するには、INSERT を使用します。 SQL INSERT INTO ステートメント[^]
既存のデータを変更するには、UPDATE を使用します。 SQL UPDATE ステートメント[^]
いずれにせよ、パラメータ化されたクエリを使用する必要があります。文字列を連結して SQL コマンドを作成しないでください。 データベース全体を破壊する可能性のある、偶発的または意図的な SQL インジェクション攻撃にさらされる可能性があります。 代わりに、常にパラメーター化されたクエリを使用してください。
文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
どの SQL が 3 つの別個のコマンドとして認識されるか:
SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';
完全に有効な SELECT
SQL
DROP TABLE MyTable;
完全に有効な「テーブルの削除」コマンド
SQL
--'
そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。
したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?
C#
using (SqlConnection con = new SqlConnection(strConnect)) { con.Open(); using (SqlCommand cmd = new SqlCommand("INSERT INTO myTable (myColumn1, myColumn2) VALUES (@C1, @C2)", con)) { cmd.Parameters.AddWithValue("@C1", myValueForColumn1); cmd.Parameters.AddWithValue("@C2", myValueForColumn2); cmd.ExecuteNonQuery(); } }
[ad_2]
コメント