ASP.. NET视图可能的漏洞,向用户暴露DB表名

本文关键字:用户 暴露 DB 表名 漏洞 视图 NET ASP | 更新日期: 2023-09-27 18:17:26

我目前正在学习ASP。. NET MVC c# Code First.

在搭建视图或使用Razor语法帮助生成表单之后,我注意到所创建的代码将html表单元素名称设置为数据库中db表的确切名称。此外,这暴露了数据库结构和实体关系。

View中Razor语法示例

@Html.HiddenFor(model => model.Product.ProductType.Name)

生成的Html如下

<input id="Product_ProductType_Name" 
    name="Product.ProductType.Name" 
    type="hidden" value="Fruits" />

从这一小段生成的html中,系统的用户将能够分辨出有2个表和一个字段的名称写入db:

    产品
  • ProductType
  • Name (ProductType字段)

是否有一种方法来隐藏这一点,例如放入一个隐藏的表前缀,如asdf_,使表名称分别为asdf_Productasdf_ProductType,或者这是不必要的?

假设这是一个用户名/密码字段。一个潜在的黑客会确切地知道他应该攻击的表的名称。

如果我没有理由担心,请告诉我。

ASP.. NET视图可能的漏洞,向用户暴露DB表名

您可以为正在讨论的视图使用视图模型。这基本上包括创建一个新的Model类,在其中您只添加必要的项,并且可以根据需要更改字段的名称。

class FormViewModel
{
    string viewName;
    ...
    public FormViewModel(ProductType type)
    {
        viewName = type.Name;
        ...
    }
}

然后可以传递给视图来代替EF模型。当模型返回到Action时,您可以简单地反转该过程:

Product.ProductType.Name = model.viewName;

这也有助于避免将"垃圾"数据传递给视图-当您只需要一个勺子时,您不会传递整个厨房。

知道表名本身并不是一个漏洞。即使知道表名,应用程序也应该能够抵御攻击。

毕竟,如果它存在一些漏洞,允许对已知的表名执行查询,那么攻击者可以先使用查询INFORMATION_SCHEMA.TABLES并检索表名。

请确保您参数化了所有查询,并且站点使用的帐户没有不必要的特权

奇怪,在视图上显示表名?我更喜欢只使用模型来显示视图所需的数据。所以你不需要暴露任何结构。只需为db-access创建一个新层,使用存储库模式,并且永远不要从控制器调用db。我会说这是糟糕的设计。MVC是一种视图模式,具有db访问的视图是危险的。

为您的数据库创建一个新项目,并使用存储库和工作单元模式。不要把你的视图模型扔到数据库中,使用它们作为数据传输对象来验证来自用户输入的模型状态,并将逻辑保留在其他层,如业务层。

关注点分离…我使用一个额外的层用于数据访问(DAL),并为我的实体使用一个公共区域。

顺便说一下,我希望你在你的表单和控制器中使用[RequireHttps]和一个防伪造令牌。