0

パラメータ化されたクエリの助けを借りてSQLインジェクションを防ぐ方法についていくつか質問があります

sqlQuery="SELECT * FROM usersTbl WHERE username=@uname AND password=@passwd";
SqlCommand cmd = new SqlCommand(sqlQuery, conn);

SqlParameter[] par = new MySqlParameter[2];

par[0] = new SqlParameter("@uname ", SqlDbType.VarChar,25);
par[1] = new SqlParameter("@passwd", SqlDbType.VarChar, 45);

次に、それらをSqlCommandにアタッチし、ExecuteScalarします。

たとえば、クライアント;DROP --はパスワード変数に文字列を挿入しますが、パラメータ化されたクエリはクエリの実行を妨げDROPますか?

ありがとうございました

4

2 に答える 2

4

もちろん、クライアントが';DROP --パスワードフィールドに値を渡すと、これは次のように解析されます。

SELECT * 
FROM usersTbl 
WHERE username=@uname AND password=''';DROP --'

オブジェクトはcommand、値で見つかった一重引用符を自動的にエスケープします。

更新1

すでに言ったように、そうではありません。引用符を2倍にすることで引用符がエスケープされるためです。例、

string pass_val = "'; DROP usersTbl;--";

それをコマンドに渡し、その値がパラメーター化されると、これは次のようになります。

SELECT * FROM usersTbl WHERE ... AND password='''; DROP usersTbl;--'

ではなく

SELECT * FROM usersTbl WHERE ... AND password=''; DROP usersTbl;--
于 2013-03-23T17:00:48.000 に答える
1

はい、パラメータ化されたクエリは、これを可能にする文字を正しくエスケープします。

于 2013-03-23T17:00:05.060 に答える