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_Product
和asdf_ProductType
,或者这是不必要的?
假设这是一个用户名/密码字段。一个潜在的黑客会确切地知道他应该攻击的表的名称。
如果我没有理由担心,请告诉我。
您可以为正在讨论的视图使用视图模型。这基本上包括创建一个新的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]和一个防伪造令牌。