0

(MySQL Connector/Net を使用して) MySQL テーブルを切り捨てようとすると例外が発生するのはなぜですか? パラメータでテーブル名を指定しようとしています。

これは私が実行しているコードです:

var connectionString = "Server="+_server+";Uid="+_user+";Pwd="+_password+";Database="+_database+";";

try
{
    using (var conn = new MySqlConnection(connectionString))
    {
        conn.Open();
        const string sql = "TRUNCATE TABLE @tablename"; // also tried with TRUNCATE @tablename
        var cmd = new MySqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@tablename", "test");
        cmd.ExecuteNonQuery();
        conn.Close();
    }

}
catch (MySqlException ex)
{
    Console.WriteLine(ex.ToString());
}

そして、これは例外です:

MySql.Data.MySqlClient.MySqlException (0x80004005): SQL 構文にエラーがあります。1 行目の「test」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

たとえば、選択クエリを試してみると、問題はありません。これは正常に実行され、正しいデータが返されます。

conn.Open();
const string sql = "SELECT body FROM test WHERE id=@pid";
var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@pid", 1);
cmd.ExecuteScalar();
conn.Close();
4

2 に答える 2

2

パラメーターは、テーブルのようなオブジェクト名ではなく、クエリ値に使用されます。

したがって、これは確実に機能しません。

文字列連結を使用して、コマンド文字列にテーブル名を設定する必要があります。テーブル名に奇妙な文字 (スペース、ダッシュ、セミコロンなど) が含まれていないか手動でチェックすることで、SQL インジェクション攻撃を回避できます。

于 2013-07-01T10:26:38.543 に答える
0

私はこれをしばらくいじっていましたが、うまくいかないようです。オンラインでドキュメントが見つからないため、試したようにパラメーターで切り捨てられない可能性があると思い始めています。

しかし、このコマンドで SQL インジェクションを防ぐ必要は本当にあるのでしょうか? ユーザーは、切り捨てたいテーブルの名前を入力しますか? その場合、単にテーブルを切り捨てるだけです...基本的にコマンドが行うことは何ですか?

于 2013-07-01T10:21:58.560 に答える