2017-07-01 20 views
-1

私はasp.netで問題があります。 買い物カゴで私はクッキーを使用しています カートに初めて商品を追加すると その商品の行が作成されます 同じ商品のボタンをもう一度クリックすると、その商品の数量が増えますここではクッキーに を新しい行を作成していないあなたは、このコードにはいくつかの深刻な問題を抱えている私のコードasp.netでクッキーの問題を解決する方法

protected void btnAddtoCart_Click(object sender, EventArgs e) 
{ 
Button obj = (Button)sender; 
string id = obj.CommandArgument.ToString(); 
DataTable dt = d.select("select * from product where product_id="+id+""); 
foreach (DataRow dr in dt.Rows) 
{ 
product_id = Convert.ToInt32(dr["product_id"].ToString()); 
Product_name = dr["product_name"].ToString(); 
price = dr["price"].ToString(); 
image1 = dr["image1"].ToString(); 
} 
quantity = 1; 
if (Request.Cookies["Addtocart"] == null) 
{ 
Response.Cookies["Addtocart"].Value = product_id.ToString() +" , "+ Product_name.ToString() + "," + price.ToString() + "," + quantity.ToString() + "," + image1.ToString(); 
Response.Cookies["Addtocart"].Expires = DateTime.Now.AddHours(1); 
} 
else 
{ 
Response.Cookies["Addtocart"].Value = Request.Cookies["Addtocart"].Value +"|" + product_id.ToString() + " , " + Product_name.ToString() + "," + price.ToString() + "," + quantity.ToString() + "," + image1.ToString(); 
Response.Cookies["Addtocart"].Expires = DateTime.Now.AddHours(1); 
} 
} 

答えて

2

です。

まず、コードはSQLインジェクション攻撃に対して脆弱です。あなたは文字列を連結してSQLクエリを形成します。誰かがボタンのコマンド引数を操作してその値が1; update products set price = 0;になったらどうなりますか?彼らはちょうどあなたのシステム上でコードを実行することができました!これを修正する方法は、パラメータ化されたクエリを使用することです。

もう1つの問題は、商品の価格情報をクライアントのCookieに保存していることです。それは危険だと思いませんか?少しのノウハウしか持たないクライアントであれば、すべての製品の費用が0になるようにクッキーを変更できます。代わりに、製品IDと数量をクッキーに格納してから、商品名と価格を取得してください。

あなたのコード「Addtocart」には魔法の文字列があります。これまでに更新したい場合は、複数の場所で変更する必要があります。代わりに、定数を作成し、必要な場所でその定数を参照してください。次に、更新する必要がある場所は1つだけです。

データテーブルの使用が不適切です。彼らは、POCO(Plain Old C#Objects)や "モデル"クラスを使用するよりも、大量のメモリを使い果たしてしまいます。

データをカスタム形式でクッキーに保存しています。これは、クッキーからデータを取り戻したいときに解析するのに苦労するでしょう。代わりに、JSONなどの単純な形式を使用してください。

あなたは文字列として商品価格を保管しています。それをしないでください!あなたは文字列で数学をすることはできません。お金を使って作業する場合は、decimalタイプを使用してください。

コードをインデントします。それははるかに簡単に読むことができます。

まず、私たちは私たちの製品を表すクラスを作成します:

はここで、これらの問題を修正、あなたの更新されたコードです。価格はタイプdecimalであることに注意してください。

public class Product 
{ 
    public string Id { get; set; } 

    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 

このクラスは、製品に関するデータベースからデータを取得するための集中化された場所として機能します。

public class ProductRepository 
{ 
    private readonly string _connectionString; 

    public ProductRepository(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public Product GetProductById(string productId) 
    { 
     using(var connection = new SqlConnection(_connectionString)) 
     { 
      // I'm going to use Dapper here because it's super handy 
      // https://github.com/StackExchange/Dapper 
      var product = connection.QueryOne<Product>(
       @"select 
         Id, 
         Name, 
         Price 
        from 
         products 
        where 
         Id = @ProductId", 
       new { ProductId = productId }); 

      return product; 
     } 
    } 
} 

これらの2つのクラスは、ユーザーが購入したい特定の製品とその数量を表します。これは、価格情報が含まれていないため、安全に保存することができます。

public class CartItem 
{ 
    public string ProductId { get; set; } 

    public int Quantity {get; set; } 
} 

public class Cart 
{ 
    public Dictionary<string, CartItem> Items { get; set; } 

    public Cart() 
    { 
     Items = new Dictionary<string, CartItem>(); 
    } 
} 

この定数は、中央のある場所に配置する必要があります。

ページの実際のロジックのための今
public constant string ShoppingCartCookieName = "Cart"; 

:私はカートロジックにアドインをリファクタリング行ってしまった時点で、私は実際にデータベースの呼び出しを行う必要はありませんでしたことを

protected void btnAddtoCart_Click(object sender, EventArgs e) 
{ 
    var addToCartButton = (Button)sender; 
    // notice I don't call .ToString() below 
    // because Button.CommandArgument is already a string 
    var productId = addToCartButton.CommandArgument;    
    var cart = GetShoppingCartFromCookie(); 

    if(cart.Items.ContainsKey(productId) 
    { 
     //their cart already contained this product, so let's bump the quantity 
     cart.Items[productId].Quantity += 1; 
    } 
    else 
    { 
     //their cart didn't contain this product, so we'll add it 
     var cartItem = new CartItem { ProductId = productId, Quantity = 1 }; 
     cart.Items.Add(cartItem.ProductId, cartItem);       
    } 

    SaveShoppingCartToCookie(cart); 
} 

private void SaveShoppingCartToCookie(Cart cart) 
{ 
    var cartJson = JsonConvert.SerializeObject(cart); //using Newtonsoft.Json 
    Response.Cookies[ShoppingCartCookieName].Value = cartJson; 
    Response.Cookies[ShoppingCartCookieName].Expires = DateTime.Now.AddHours(1); 
} 

private Cart GetShoppingCartFromCookie() 
{ 
    if (Request.Cookies[ShoppingCartCookieName] == null) 
    { 
     return new Cart(); 
    } 
    else 
    { 
     var existingCartJson = Response.Cookies[ShoppingCartCookieName].Value; 
     // you may wish for some logic here to make sure the JSON can be converted 
     // to a Cart since a user could have modified the cookie value. 
     var cart = JsonConvert.DeserializeObject<Cart>(existingCartJson);    
     return cart; 
    } 
} 

お知らせ製品に関する情報を入手してください。今すぐより速く走り、より効率的になるでしょう。

関連する問題