1

私はこのようなSQLクエリでいくつかのパラメータを使用しようとしています。

    Answer_table = new MySqlParameter("@answerTable", AT);
    MySqlCommand solved_q = new MySqlCommand("SELECT * FROM @answerTable WHERE UserID = @uID", c2.get_con());
    solved_q.Parameters.Add(Answer_table);
    solved_q.Parameters.Add(uID);

しかし、期待どおりに機能していません。テーブル名(@answerTable)のパラメーターを使用しない場合、uIDで機能しますが、許可されていないためですか?それを行う他の方法がある場合はどうなりますか?

どんな助けもいただければ幸いです:)

4

4 に答える 4

3

FROMパラメータを使用して句を指定することはできません。

実際の文字列を作成することにより、SQLステートメントを作成できます。

new MySqlCommand(String.Format("SELECT * FROM {0} WHERE UserID = @uID"
                 , answertable)
                 , c2.get_con());

ansertable注-変数の操作を許可しないことにより、SQLインジェクション攻撃から保護するようにしてください。

于 2012-06-21T16:05:41.953 に答える
2

プリペアドステートメントの実行パスをコンパイルするためにDBMSが必要とする情報の一部であるため、許可されていません。

準備する前に、実行時にステートメントを文字列として作成する必要があります。幸いなことに、ほとんどのDBMSは、準備されたstatemtentをキャッシュします。

重要な注意事項:テーブルの名前が何らかの形で「外部から」来ている場合(たとえば、HTMLリクエストのパラメータ)、SQLインジェクションを回避するために非常に注意する必要があります(つまり、誰かが「table1」のような悪を渡す可能性があります;予期したものの代わりにテーブルtable1を削除すると、SQLステートメントの意味が予期しない方法で変更されます)。

于 2012-06-21T16:07:30.993 に答える
0

試す

MySqlCommand solved_q = new MySqlCommand(
    String.Format("SELECT * FROM {0} WHERE UserID = @uID", AT),
    c2.get_con());
solved_q.Parameters.AddWithValue("@uID", uID); 

ATプログラムで決定され(私は願っています)、ユーザーが入力しないため、ここではSQLインジェクションの問題は発生しません。

于 2012-06-21T16:06:40.637 に答える
0

それの音によって、あなたはSELECTを実行しているので、新しいテーブルを作成していません...そうは言っても、クエリの時点でデータベースにあるテーブルはすでに知られています。有効なテーブルのリストをデータベースに照会して、この事実を利用してください。最初にリストにデータを入力してから、正気のために提供されたテーブル名を検証します。有効なリストにある場合は、文字列を作成し、dbに対して実行します。

于 2012-09-07T19:57:32.823 に答える