2011-07-07 6 views
0

テーブルを更新しようとしています。ユーザーが数量を入力できるTextBoxが1つしかないページがありますが、それは更新されません。エラーや何もありません。そして、ちょうど列に「1」があり、次に「6」と言うように更新した後、テーブルに戻ってその特定の行が「0」になったとしましょう。理解できません。更新するだけで動作しません

URLのクエリ文字列部分を見ると、私はフォームにufingを投稿する値に関係なく、常に0がクエリ文字列であると言います。

var UpdateQuantityQuery = ""; 
    if(Request.Form["IsBoxed"].AsBool() == true) 
    { 
     UpdateQuantityQuery = "UPDATE Cart SET Boxes = '" + Request.Form["quantity"].AsInt() + "' WHERE PartNumber = '" + Request.Form["PartNumber"] + "' AND IsBoxed = 'True' AND OrderId = '" + Session["OSFOID"] + "'"; 
     database.Execute(UpdateQuantityQuery); 

     // Redirect back to their SHopping Cart now. 
     Response.Redirect("~/Account/Cart.cshtml"); 
    } 
    else 
    { 
     UpdateQuantityQuery = "UPDATE Cart SET Units = '" + Request.Form["quantity"].AsInt() + "' WHERE PartNumber = '" + Request.Form["PartNumber"] + "' AND IsBoxed = 'False' AND OrderId = '" + Session["OSFOID"] + "'"; 
     database.Execute(UpdateQuantityQuery); 

     // Redirect back to their SHopping Cart now. 
     Response.Redirect("~/Account/Cart.cshtml"); 
    } 

、フォームのコードは次のとおりです:ここで

は、私が持っているものだ

<form method="post" action="EditQuantity.cshtml?Update=OK&[email protected]["PartNumber"]&[email protected]["IsBoxed"]"> 
    <fieldset> 
     <legend>Edit Quantity</legend> 
     <label for="quantity"> 
       @Message 
     </label> 
     <input type="text" name="quantity" title="Edit Quantity" /> 
     <input type="submit" value="Confirm" title="Confirm Change" /> 
    </fieldset> 
</form> 

が、私はこれがcojombulateさせることができ、ここで何かを間違ってやっていますか?あなたは

if(Request.QueryString["IsBoxed"].AsBool() == true) 

を形成していない使用する必要があります

+1

正確に何がデータベースに送られているかを見るために 'UpdateQuantityQuery'も表示してください。 '.AsInt()'は何をしますか? –

+4

あなたの質問に答えるのではなく、あなたのコードを見て、SQLインジェクション攻撃とそれを避ける方法を読んでみてください。クエリを書く方法は、SQLクエリでユーザー入力を使用しない方法の教科書の例です。 http://msdn.microsoft.com/en-us/library/ff648339.aspx – David

+4

"PartNumber"というパラメータを持つフォームポストを ''; DROP TABLE CART'として送信したいのですが、あなたのコードはSQLインジェクションに対して非常に脆弱です。いくつかの緊急性のあるパラメータ化されたクエリを調べます。 – spender

答えて

2

、あなただけの推測ではないフォーム要素

+1

Argh。私はあなたがGET要求の裏にDB更新を励ましていないことを願っていますか?クエリ文字列による変更データの送信は大きな問題ではありません。本当の答えは、クエリ文字列を使用しないように、リクエストをポストに変更することです。 – spender

+0

+1。これはおそらく、アップデートが実行されていない理由についての正しい答えでしょう。しかし、これはひどく悪い考えです。クエリ文字列を簡単に改ざんすることができます。他のサーバーから彼に投稿するフォームを作成するのは難しくありませんが、少なくともフォーム文字列変数をクエリ文字列変数よりも改ざんするのは少し難しいです。 – David

+0

URLをスニッフィングすると、フォームの投稿によって転送されたペイロードを盗聴するよりもはるかに簡単です。 URLはウェブ全体に日常的に記録されています...ユーザーデータがこれらのログにポップアップすることは望ましくありません。 – spender

1

としてクエリ文字列を通じてこの情報を送信しているが、それはあなたの更新クエリで使用すると、更新していることが考えられ文字列を持つ整数型?あなたがキャストしている値を単一引用符で整数にラップしているようです。私はそれがデータベースでどのように型が定義されているかによって異なります。整数として定義されている場合は、一重引用符を削除してみてください。それらが文字列として定義されている場合、それらを整数にキャストする理由はありません。ちょうど推測。

+0

うーん、それはそれかもしれないと思います、私は今それをチェックしています。それを指摘していただきありがとうございます! – bendr

+0

ありがとうございます - しかし、私はそれを変更し、数量の周りの引用符を削除 - しかしそれはまだ更新されません。 – bendr

+0

IsBoxed = 'True'を一重引用符で囲みましたか? IsBoxedがビットタイプとして定義されている場合、これは動作しない可能性があります。 –

関連する問題