属性 [Bind(Exclude="")] 无法防止过度发布

2023-11-30

防止 MVC 4 过度发布的最佳方法是什么?

根据 MS 的消息来源,[Bind] 属性应该是通过阻止传入的表单值进入数据库来防止过度发布的最简单方法。使用最新版本的 MVC 和 EF,这似乎并没有按预期/宣传的那样工作,除非我错过了一些重要的东西。

From Wrox 专业 ASP.NET MVC 4(Jon Galloway 的第 7 章),以下类应该防止过度发布:

[Bind(Exclude="IsAdmin")]
public class User
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public bool IsAdmin { get; set; }
}

但 [Bind] 属性所做的只是阻止表单提交值绑定到模型。然后,模型有一个空白/默认值,该值被写回数据库。在这种情况下,每次使用此模型调用 .SaveChanges() 时,都会确保 IsAdmin = false。任何“真”值都会被覆盖。这是一个巨大的安全失败。

替代语法 - 将 [Bind] 放在编辑控制器操作参数中 - 执行完全相同的操作:

public ActionResult Edit([Bind(Exclude = "IsAdmin")] User user)

调用 .SaveChanges() 时,所有“真”值都会被覆盖,这与 K. Scott Allen 关于该主题的博客文章相矛盾:http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

唯一的选择似乎是一系列与 Automapper 连接的专用 ViewModel。虽然安全,但这似乎是一个令人头疼的问题,尤其是在以下情况下:

  • 您可能对创建、编辑、索引和详细信息操作有不同的要求,需要不同的 ViewModel
  • 您可能需要公开一些只读字段(例如编辑操作上的 CreatedBy),这些字段在属性上不能具有 [ReadOnly] 属性,因为它们是由创建操作更新的

我知道有人会回应说你应该never将数据模型绑定到视图,但这是默认的模板行为以及几乎所有文档中显示的方式。此外,MVC + EF 应该创造生活easier, not harder,并且与 AutoMapper 连接的大量 ModelView 类并不是我认为更容易的。

那么有人知道如何使 [Bind] 发挥广告中的功能吗?


我想你这次可能被 Wrox 的书误导了。您所描述的是绑定/排除属性的预期行为。看http://msdn.microsoft.com/en-us/library/system.web.mvc.bindattribute.exclude(v=vs.108).aspx.

如果您不想将值绑定到模型上的每个属性,我相信 ViewModel 是一种不错的选择,尽管您正确地指出它们是一种开销。尽管如此,使用它们的优点是显着的,并且在这种情况下,IMO 证明额外的开发工作是合理的。例如:

  • 允许部分实体更新
  • 呈现来自多个实体的数据
  • 将 UI 与域模型解耦,允许您改变标签、验证规则、错误消息

Automapper 是执行从实体到视图模型的映射的一种选项,但如果您使用延迟加载,请小心。我发现 Automapper 没有按照我希望的方式处理 EF 代理类的更新。最后,我删除了 AM,并基于 IMappable 接口和通用实用程序类推出了自己的映射机制。在许多情况下,只需键入更多代码即可完成此操作,而无需配置 Automapper。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

属性 [Bind(Exclude="")] 无法防止过度发布 的相关文章

  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • .edmx 文件的用途是什么?

    edmx 文件的用途是什么 阅读 CSDL SSDL 和 MSL 规范 在我看来 edmx 文件仅在设计时使用 我们打算将它与其他 edmx 一起分发吗 看来我们需要分发 ssdl 和 或 csdl 文件 EDMX 是 Visual Stu
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • PHP:file_get_contents 无法打开流:连接被拒绝

    我正在尝试访问第二台服务器file get contents和 simple load xml 我得到 无法打开流 连接被拒绝 结果会怎样呢 allow url fopen Yes allow url include Off 是我的 php
  • 在 Swift 中转换为不同的 C 结构不安全指针

    我想调用 Posix 套接字函数socket and bind来自斯威夫特 socket很容易 需要Int32s but bind造成了问题 因为我有一个sockaddr in指针 但它需要一个sockaddr指针 在 C 语言中 这将是一
  • 了解 NodeJS WebSocket 服务器的对象创建和垃圾收集

    我正在使用wsNodejs 中用于 Web 套接字服务器的模块 代码的简化版本是这样的 var WebSocketServer require ws Server var wss new WebSocketServer port 9001
  • 如何将字符串日期转换为长毫秒

    我在字符串中有一个日期 例如 12 December 2012 如何将其转换为毫秒 长 Using 简单日期格式 String string date 12 December 2012 SimpleDateFormat f new Simp
  • 为数据表中的计算列定义 DateDiff

    我有 日期时间已过期 列 我想创建另一个名为 已过期 的列 该列将根据过期日期显示 是 或 否 如果日期已过 则显示 是 我写了这个 DataColumn colExpirationDate new DataColumn DateTimeE
  • 重新计算动态布局属性

    这是一个可调整大小的窗口 设置动态布局属性 以便顶部组框调整宽度大小 下部组 框和树以及 3 个按钮在两个维度上调整大小 对于高级复选框 我添加了代码来隐藏额外的控件并调整关联框的高度 所以它看起来像这样 用于切换控制值的代码是 void
  • 删除或更新模拟器上的 Google Play 服务

    我编写了一个使用谷歌地图 API v2 的 Android 应用程序 我想在模拟器上测试它 但为了显示地图它有一点问题 我用谷歌搜索并找到了文章 我必须将其安装到软件包 vending apk android gms apk 中 我下载了软
  • Hammer.js 无法删除事件监听器

    我创建了一个锤子实例 如下所示 var el document getElementById el var hammertime Hammer el 然后我可以添加一个监听器 hammertime on touch function e c
  • jQuery :使用已弃用的 .toggle() 替代方法

    我有一些类名为 mute btn 的图像 当我单击它们时 我的图像源正在更改 mute btn toggle function var clicked false var src this attr src src src replace
  • Winform 应用程序名称在 Windows 10 任务管理器的“启动”选项卡上显示为 _alphanumeric

    在 Windows 10 上 我的表单应用程序显示为字母数字字符 1F036AE84FF792FB79A74F 启动选项卡 in 任务管理器 它是一个MSI安装文件 以下是运行 exe 的路径 C Users win10user AppDa
  • jQuery 如果 DIV 没有类“x”

    在 jQuery 中 我需要执行一个 if 语句来查看 this 是否不包含类 selected thumbs hover function this stop fadeTo normal 1 0 function this stop fa
  • PCM:无法访问合作伙伴

    按照快速入门指南操作时 合作伙伴连接管理器 PCM 出现问题 采取的步骤 启用智能设备管理API 配置 OAuth 权限屏幕 添加了 智能设备管理 API auth sdm service 的范围 为新的 Web 服务器创建 OAuth 令
  • JavaScript函数将unicode伪字母转换为常规字符?

    我正在尝试编写一个函数 该函数接受包含 unicode 伪字母表中的字符的任何字符串 并返回一个等效字符串 其中这些字符已替换为 ASCII 中的常规字符 const toRegularCharacters s gt toRegularCh
  • 读取内存中的exe文件并执行

    是否可以使用Windows将文件读入内存 将数据保存在字节数组中 从文件系统中删除原始文件并从内存中执行它 EDIT 我的目标是保护我的 java 代码免受逆向工程的影响 我用 C 编写了一个启动器 它获取加密的 jar 文件 解密并启动它
  • Tensorflow:如何编码和读取bmp图像?

    我正在尝试读取 bmp 图像 对这些图像进行一些增强 将它们保存到 tfrecords 文件中 然后打开 tfrecords 文件并使用这些图像进行图像分类 我知道有一个 tf image encode jpeg 和一个 tf image
  • Android 调用“requestWindowFeature( Window.FEATURE_PROGRESS );”时出错在活动中

    我正在尝试在 Android 活动中显示 WebView 的加载进度 当我尝试使用以下命令显示窗口的进度条时 requestWindowFeature Window FEATURE PROGRESS as per http develope
  • 如何为 HTML 页面创建渐变背景

    我正在学习 HTML 为 HTML 页面创建渐变背景的最佳方法是什么 到目前为止 这是我的背景 body style background color Powderblue 我知道这不是渐变 这不能在 html 中完成 但可以在 css 特
  • 发送推送通知 Firebase React-JS

    我正在开发一个使用 Firebase 云消息传递反应的项目 我正在将其发送到我的服务器 但它不起作用 当然我已经尝试过了 但我不知道又出了什么问题 下面是代码 这里它发送一个POST向 Firebase 请求 它应该向用户发送通知 asyn
  • Java:将文件名分为基本名和扩展名

    有没有比类似的方法更好的方法来获取文件基名和扩展名 File f String name f getName int dot name lastIndexOf String base dot 1 name name substring 0
  • 属性 [Bind(Exclude="")] 无法防止过度发布

    防止 MVC 4 过度发布的最佳方法是什么 根据 MS 的消息来源 Bind 属性应该是通过阻止传入的表单值进入数据库来防止过度发布的最简单方法 使用最新版本的 MVC 和 EF 这似乎并没有按预期 宣传的那样工作 除非我错过了一些重要的东