この関数を SQL インジェクションから保護する方法は何ですか?
P粉573943755
P粉573943755 2023-11-07 22:03:43
0
2
736

public static bool TruncateTable(string dbAlias, string tableName)
{
    string sqlStatement = string.Format("TRUNCATE TABLE {0}", tableName);
    return ExecuteNonQuery(dbAlias, sqlStatement) > 0;
}

P粉573943755
P粉573943755

全員に返信(2)
P粉434996845

私の知る限り、少なくとも Oracle や SQL Server では、パラメーター化されたクエリを使用して DDL ステートメントを実行したり、テーブル名を指定したりすることはできません。クレイジーな TruncateTable 関数を使用し、SQL インジェクションを回避できなければならない場合、入力が安全に切り捨てられるテーブルかどうかをチェックするストアド プロシージャを作成することになります。

リーリー
いいねを押す +0
P粉738346380

SQL インジェクションに対抗するための最も一般的なアドバイスは、SQL クエリ パラメーターを使用することです (このスレッドの何人かの人がこれを行うことを提案しています)。

この場合、これは間違った答えです。 DDL ステートメント内のテーブル名に SQL クエリ パラメーターを使用することはできません。

SQL クエリ パラメーターは、SQL 式のリテラル値の代わりにのみ使用できます。これは、すべての SQL 実装の標準です。

テーブル名がある場合、SQL インジェクションを防ぐための私のお勧めは、既知のテーブル名のリストに対して入力文字列を検証することです。

有効なテーブル名のリストは、INFORMATION_SCHEMA:

から取得できます。 リーリー

これで、入力変数を SQL パラメーターとしてこのクエリに渡すことができます。クエリが行を返さない場合は、入力が無効であり、テーブルとして使用できないことがわかります。クエリが行を返す場合、その行は一致するため、より安心して使用できます。

@John Buchanan を提案したように、アプリケーションで切り捨てられるように定義したテーブルの特定のリストに対してテーブル名を検証することもできます。

tableName が RDBMS にテーブル名として存在することを確認した後でも、スペースや特殊文字を含むテーブル名を使用する場合に備えて、テーブル名を区切ることをお勧めします。デフォルトの識別子の区切り文字は角括弧です:

リーリー

これで、SQL インジェクションの危険にさらされるのは、tableName が実際のテーブルと一致し、実際にテーブル名に角括弧を使用している場合のみです!

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート