2012-03-22 15 views
0

私は、SQLインジェクションの防止のためのSqlCommandオブジェクト機能を使用して挿入するSQL文を持っているが、それはエラーを与える:マルチパート識別子を"System.Web.UI.HtmlControls.HtmlInputText"をバインドできませんでした。同じテーブルを問題なく更新するために同じSqlCommand機能を使用していますが、この簡単な挿入はエラーを示しています。誰も助けることができますか?マルチパート識別子「System.Web.UI.HtmlControls.HtmlInputTextは、」バインドできませんでした

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) " + 
     "VALUES (" + Session["DS0402Key"] + "," + @VisitorLName + ");"; 

try 
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn)) 
    { 
    cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value); 
    cmd.ExecuteNonQuery(); 
    } 
} 

catch (Exception ex) 
{ 
//error handling code 
} 
+2

'sSql'が構築される方法は、SQLインジェクションに対して脆弱であるようです。 [Bobby Tables](http://xkcd.com/327/)があなたのユーザーの一人であると考えましたか? –

+1

準備されたステートメントは、すべての変数の値をパラメーターに入れない限り、あまり役に立ちません。この場合、たとえば、 '@ VisitorLName'と同じように、' VALUES(@ DS0402Key、@VisitorLName) 'と言って、' @ DS0402Key'パラメータをコマンドに追加します。 – cHao

答えて

2

それは確かにエラーを投げています。このコードであれば、私の推測では、あなたのエスケープと引用はすべてのジャッキアップされているので、あなたがVisitorLNameを想定し

INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) 
VALUES (whatever your key is unquoted!, System.Web.UI.HtmlControls.HtmlInputText) 

(のようなクエリで終わるということでしょうコントロールはHtmlInputTextです)。文字列"@VisitorLName"を追加していないので、引用符で囲まれていません。VisitorLName.ToString() ...から戻り値を挿入しています。これは、AFAIKがコントロールの型の完全修飾名を返します。

@は、変数名などのキーワードを使用できるように、C#の識別子をエスケープする方法であるため、引用符なしで@VisitorLNameを盗聴するとエラーは発生しません。 + VisitorLName + ...)

また、SQL文字列を作成する方法では、SQLインジェクションを防止する主な機能であるパラメータを利用していないため、SQLビルドを簡素化し、起動する!パラメータを使用する場合は、テーブル名などの意味ではないすべての値にパラメータを使用します。 (テーブル/データベース/スキーマ/ etcの名前については、あなた自身であり、パラメータを使用することはできません。読み込み:SQLインジェクションの脆弱性があります。 !)、問題を解決し、あなたのコードを変更するために

それはまた

sSql = "INSERT INTO [camss].[dbo].[tb_ds0402req] ([ds0402_key] ,[lname]) " + 
     "VALUES (@DS0402Key, @VisitorLName)"; 

try 
{ 
    using (SqlCommand cmd = new SqlCommand(sSql, conn)) 
    { 
    cmd.Parameters.AddWithValue("@DS0402Key", Session["DS0402Key"]); 
    cmd.Parameters.AddWithValue("@VisitorLName", VisitorLName.Value); 
    cmd.ExecuteNonQuery(); 
    } 
} 
catch (Exception ex) 
{ 
//error handling code 
} 

のようなものを読み取るように、あなたがセッションにキーを貼り付けている場所を見つける...とあなたを確認してくださいその値だけではなく、全体のコントロールを挿入しません。

+0

あなたの回答をありがとう、すべての良い提案。 Session ["DS0402Key"]をパラメータとして追加しようとしましたが、insert sqlで参照すると、VS2010は現在のコンテキストに存在しないというエラーを返します。私はSQLで@VisitorLNameと一緒にDS0402Keyの値をハードコーディングしようとしたが、私はまだ元のエラーを受け取ります。 – user1174548

+0

DS0402Key列を完全に削除して、問題を引き起こしている可能性があることを除外しましたが、依然として元のエラーが表示されます。 – user1174548

+0

これは上記の追加されたパラメータだけではありません。 SQLの文字列に注意してください(特に、私はそれをビルドしているわけではありません;私はパラメータが仕事をするようにしています)。あなたが物事をしていたやり方は、すべてが間違っていると言われています。それはあなたのエラーが起こっている可能性が高いところです。 – cHao

関連する問題