sql >> データベース >  >> RDS >> Sqlserver

SQLインジェクションを防ぎながら、ユーザーがテーブル名と列名を渡すことができるようにする

    これは、 QUOTENAME() 解決するために作成されました。列名とテーブル名をパラメーターとしてQUOTENAME()に渡します。 次に、その出力を使用して、動的SQLクエリでデータベース内のオブジェクトを表します。

    //The evil name tries to expliot code like:
    //  set @sql = N'CREATE TABLE [' + @tablename + N'] (Foo int)'
    var evilName = "someName] (Foo int); Drop table students --";
    
    var query = @"
    declare @sql as nvarchar(max)
    set @sql = N'CREATE TABLE ' + QUOTENAME(@tablename) + N' (Foo int)'
    exec sp_executesql @sql
    ";
    using(var connection = new SqlConnection(ConnectionString))
    using(var command = new SqlCommand(query, connection))
    {
        command.Parameters.Add("@tablename", SqlDbType.NVarChar, 128).Value = evilName ;
        connection.Open();
        command.ExecuteNonQuery();
    }
    

    サーバーで実行されるクエリは

    になります
    CREATE TABLE [someName]] (Foo int); Drop table students --] (Foo int)
    

    これにより、有効なテーブル名でテーブルが作成され、他のテーブルは削除されません。




    1. Postgresratio_to_report関数

    2. MAMPMysqlエラー-ログを開くことができませんでした

    3. 外部キーの依存関係を含む複数のテーブルにデータを挿入する方法(MySQL)

    4. 複数の画像ファイルをphpmysqlギャラリーにアップロードする