6

C#アプリケーションからデータベースを作成するために使用される次のコードがあります

SqlConnection myConnection = new SqlConnection(ConnectionString);
string myQuery = "CREATE DATABASE " + tbxDatabase.Text; //read from textbox
myConnection.Open();
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();

安全かどうか心配ですが、C# は "A; DROP TABLE B" などのハッカーの入力を受け入れますか? より安全にする方法は?

4

5 に答える 5

5

テーブル名と列名はパラメーター化できませんが、防御の最初の行として、中かっこなどの区切り文字でテーブル名をラップします。

string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";

または、入力の値をチェックするユーザー定義関数を作成します。

private bool IsValid(string tableName)
{
    // your pseudocode
    // return somthing
}

次に、コードで、

if (IsValid(tbxDatabase.Text))
{
    SqlConnection myConnection = new SqlConnection(ConnectionString);
    string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";
    myConnection.Open();
    SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
    myCommand.ExecuteNonQuery();
}
else
{
    // invalid name
}
于 2013-02-26T15:08:40.460 に答える
1

はい、あなたのコードは非常に安全ではありません.1つの代替手段は、正確なパラメーターのみを受け入れるストアドプロシージャを作成して、その場でコマンドを構築することを避けることです.

C# 自体は、ypu がこれらのことを回避するのに役立ちません。アプリケーション ロジックに埋め込む必要があります。

于 2013-02-26T15:10:14.660 に答える
1

ストアド プロシージャを使用してパラメーターを渡す

于 2013-02-26T15:12:16.387 に答える
0

これを実現する安全な方法は、SQL 関数 QUOTENAME() を使用して入力をエスケープすることです。

CREATE PROC example_create_db ( @db_name NVARCHAR(256) )
AS 
    BEGIN
        DECLARE @sql NVARCHAR(1000)
    /*
        QUOTENAME() adds the surrounding []'s
    */

        SET @sql = 'CREATE DATABASE ' + QUOTENAME(@db_name) 
        EXEC sp_executesql
    END
于 2013-02-26T16:23:02.357 に答える
0

実際の作成コマンドをストアド プロシージャ内に配置します。

テキストボックスのテキストを文字列に貼り付けて実行しないでください。

編集:わかりました。CREATE には定数式が必要なため、コマンドをパラメーター化することはできません。

ただし、これをコードで行う必要がある場合は、入力を文字列に連結する前に、少なくとも入力を検証する必要があります。この場合、a ~ z、A ~ Z 以外を含むテーブル名は許可しないでください。

于 2013-02-26T15:09:34.440 に答える