ユーザは、SQL Server、テーブル名、およびデータベース内の特定のデータベースにテーブルを作成できる(イントラネット)Webページ(ASP.NET C#)を持っています。列名/ sはフリーテキストフィールドであり、実際の構造はいくつかのドロップダウンによって決まります。私は、私のテキストボックスからのテキストと連結された純粋な文字列がSQLインジェクションの影響を受けやすいため、create table文を渡すことを認識しています。パラメータではなく、まだ存在していないdbオブジェクトの実際の名前を渡していることを考えれば、文字列を連結する前に各テキストボックスに不正な文字がないかチェックする以外の方法がありますか?SQLインジェクションを防止しながらテーブル名とカラム名を渡すことを許可する
1
A
答えて
1
これは解決するために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)
になります。
+0
私はこれが私が探していると思いますが、あなたのコードをテストとして実装しようとすると、私はエラーが発生しています:無効な初期化子メンバ宣言子の行:command.Parameters.Add( "@ tablename "、SqlDbType.NVarChar、128).Value = evilName –
+0
@HelloWorldは前の行で') 'を忘れてしまいました。それは問題だったかもしれません。私はそれをテストせずに、WebブラウザにC#の部分を書き、誤字があるかもしれません。 –
関連する問題
- 1. SQLクエリからテーブル名とカラム名を取得するString
- 2. 防止SQLインジェクションとのSqlDataAdapter
- 3. .NETの動的SQLでテーブル名または列名をサニタイズしますか? (防止SQLインジェクション攻撃は)
- 4. SQL Server - SQLインジェクションを防止する
- 5. フォームデータ:防止SQLインジェクション
- 6. Codeigniter RestFul library SQLインジェクションを防止する
- 7. SQLインジェクションの挿入を防止する
- 8. SQLインジェクションを防止するHttpUtility.UrlEncode
- 9. SQLインジェクションの防止 - mybatisとspring
- 10. AspNetUsersテーブルSQLインジェクション攻撃を防止するには?
- 11. 名前付きパラメータの主なパフォーマンスの低下とネイティブSQLでのhibernateを使用したSQLインジェクションの防止
- 12. ドメイン名がカールを介してPHPファイルにアクセスするのを許可すること、許可すること、および許可しないこと
- 13. subselectステートメントを使用したSQLのSQLiteカラム名がカラム名の前にテーブル名
- 14. SQL Developerがテーブル名とカラム名を大文字に変更する
- 15. mysqlデータベースの既存のテーブル名としてカラム値を渡す
- 16. 関数にパラメータとしてカラム名を渡すには?ここ
- 17. SQLAlchemyテーブル名とカラム名から属性名を取得
- 18. PHP防止SQLインジェクション/ XSS
- 19. PHP SQLインジェクション防止技術
- 20. SQLインジェクションの防止方法
- 21. PHP SQLインジェクション防止構文
- 22. SQLインジェクション防止用パッケージ
- 23. c#to PHP SQLインジェクション防止
- 24. URLインジェクションを防止する
- 25. ストアドプロシージャを使用するとSQLインジェクション/ XSXX攻撃が防止されますか?
- 26. regexp_replaceを使用してSQLインジェクションを防止する
- 27. JSQLPARSEを使用してSQlからテーブル名とカラム名を取得する方法
- 28. apache calciteはテーブル名とカラム名を区別する
- 29. 匿名ユーザーがSonarにアクセスすることを許可しない
- 30. pyodbcを使用してSQLテーブルのカラム名をリストとして保存する
'QUOTENAME()':https://msdn.microsoft.com/en-us/library/ms176114.aspx。 –