2016-11-09 8 views
1

ユーザは、SQL Server、テーブル名、およびデータベース内の特定のデータベースにテーブルを作成できる(イントラネット)Webページ(ASP.NET C#)を持っています。列名/ sはフリーテキストフィールドであり、実際の構造はいくつかのドロップダウンによって決まります。私は、私のテキストボックスからのテキストと連結された純粋な文字列がSQLインジェクションの影響を受けやすいため、create table文を渡すことを認識しています。パラメータではなく、まだ存在していないdbオブジェクトの実際の名前を渡していることを考えれば、文字列を連結する前に各テキストボックスに不正な文字がないかチェックする以外の方法がありますか?SQLインジェクションを防止しながらテーブル名とカラム名を渡すことを許可する

+3

'QUOTENAME()':https://msdn.microsoft.com/en-us/library/ms176114.aspx。 –

答えて

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) 

になります。

enter image description here

+0

私はこれが私が探していると思いますが、あなたのコードをテストとして実装しようとすると、私はエラーが発生しています:無効な初期化子メンバ宣言子の行:command.Parameters.Add( "@ tablename "、SqlDbType.NVarChar、128).Value = evilName –

+0

@HelloWorldは前の行で') 'を忘れてしまいました。それは問題だったかもしれません。私はそれをテストせずに、WebブラウザにC#の部分を書き、誤字があるかもしれません。 –

関連する問題