代码之家  ›  专栏  ›  技术社区  ›  cem

实体记录安全性

  •  0
  • cem  · 技术社区  · 15 年前

    它的工作正常,但当用户通过Firebug将“productdto.property1”字段名更改为“productdto.property2”时,dto的property2设置将作为客户端请求。同时,我不想知道DTO,但是当我将一个实体映射到页面进行编辑时,客户机可以更改DB记录。

    我想用角色保护一些属性。用户无法更改,但管理员可以

    有这样的解决办法;

    [Secure(Role="Admin")]
    public string Property2 { get; set; }
    

    DTO:

    public class ProductDTO
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }
    }
    

    在ASPX中:

    <%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserControl<CmTest.Web.Controllers.ProductController.ProductFormViewModel>" %>
    
    <% using (Html.BeginForm()) { %>
    <%= Html.AntiForgeryToken() %>
    <label for="Product_Property1">Property1:</label>
    <div>
        <%= Html.TextBox("ProductDTO.Property1", (ViewData.Model.ProductDTO != null) ? ViewData.Model.ProductDTO.Property1 : "")%>
    </div>
    <% } %>
    

    控制器:

    [Transaction]
    public ActionResult Edit(int id)
    {
        ProductFormViewModel viewModel = ProductFormViewModel.CreateProductFormViewModel();
        viewModel.ProductDTO = productRepository.GetDTO(id);
    
        return View(viewModel);
    }
    
    [ValidateAntiForgeryToken]
    [Transaction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(ProductDTO productDTO)
    {
        //debugging
    }
    
    public class ProductFormViewModel
    {
        private ProductFormViewModel() { }
    
        public static ProductFormViewModel CreateProductFormViewModel()
        {
            ProductFormViewModel viewModel = new ProductFormViewModel();
    
            return viewModel;
        }
    
        public ProductDTO ProductDTO { get; internal set; }
    }
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Darin Dimitrov    15 年前

    我很难理解您的要求,但如果您担心大规模分配,可以将Property2排除在绑定之外:

    public ActionResult Edit([Bind(Exclude = "Property2")]ProductDTO productDTO)
    

    或者更好的使用 Include 生成可绑定属性的白名单。