2017-02-23 4 views
1

私はWebmatrixのデータベースアプリケーションに取り組んでいます。私は、データベースのレコードを更新するはずのcshtmlファイルを持っています。私はSQLコマンドの文字列連結を使用するとすべて正常に動作しますが、私はそれが安全でないことを知っています。ですから、私は代わりにパラメータを使用しようとしています。しかし、私はSQLパースエラーを取得します。パラメータを使用するとSQL解析エラーが発生するのはなぜですか?

作品:

@{ 
    string dbName = Request["db"]; 
    string tble = Request["t"]; 
    string idName = Request["idn"]; 
    string id = Request["id"]; 
    string field = Request["f"]; 
    string value = Request["v"]; 

    var db = Database.Open(dbName); 
    var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]='"+value+"' WHERE ["+idName+"]='"+id+"'"); 
    <text>Result: @result</text> 
} 

エラーが発生します。それは潜在的なSQLインジェクション攻撃が可能になるので、

@{ 
    string dbName = Request["db"]; 
    string tble = Request["t"]; 
    string idName = Request["idn"]; 
    string id = Request["id"]; 
    string field = Request["f"]; 
    string value = Request["v"]; 

    var db = Database.Open(dbName); 
    var result = db.Execute("UPDATE @0 SET @[email protected] WHERE @[email protected]",tble,field,value,idName,id); 
    @*var result = db.Execute("UPDATE ["+tble+"] SET ["+field+"]='"+value+"' WHERE ["+idName+"]='"+id+"'");*@ 
    <text>Result: @result</text> 
} 

Error Message

+1

テーブルとカラム名は – Nino

+0

はこれをしないでくださいパラメータとして渡すことはできません!クエリとは、自分でコミットする場所です。あなたの質問は、花嫁を選ぶ前に結婚式を予約することと同等のプログラミングに相当します(または、新郎は習慣に入る必要があります)。 – bbsimonbb

+0

テーブル名とカラム名をパラメータ化することは、通常、壊れたデータモデルの兆候です。 * one *テーブルの* one *カラムに格納されるべきである同じ "タイプ"のデータは、代わりに複数のテーブルとカラムに分散されています。多くの場合、データが分散されているため(クエリや繰り返し条件で多くのテーブルや列に名前を付ける必要があります)、いくつかの* data *が埋め込まれているため、このデータに対してクエリを書くことが必要な場合がありますデータとしてモデル化されていなければならないときは、これらの表と列の*名前*に変換します。 –

答えて

1

パラメータ化されたSQLコマンドは、テーブルやカラム名を受け付けません。これはセキュリティ機能です。

通常、フォームまたは要求のテーブル名と列名をSQL文字列に渡すことができないようにするのは設計上の選択肢の悪さです。

より良い方法は、整数値を使用して対応するテーブルまたは列にマッピングすることです。

最初にリクエストやフォームを通じて公開されることのない機密データに悪意のある目的でアクセスすることを避けるか、少なくとも悪意のある人には難しくします。

+0

それは感謝します、ありがとう! – Lemniscate

関連する問題