C# Asp.net MVC 3加密隐藏值

C# Asp.net MVC 3加密隐藏值,c#,asp.net-mvc,security,hidden-field,C#,Asp.net Mvc,Security,Hidden Field,我正在寻找关于如何以安全的方式在客户端和服务器之间来回传递id的建议或真正好的教程,我不会传递用户id或类似的东西,但是我可能会传递项的id表行。我想对用户隐藏这些ID。我希望我可以避免将它们放在页面中,但是考虑到它们是pk,我别无选择,只能在客户端和服务器之间来回传递值 谢谢你的帮助 编辑:我计划检查用户是否拥有执行此类操作的权限,但是我仍然希望隐藏数据。正如您所提到的,将项目表行的主键输出到视图中不是一种理想的做法,就好像它们在页面的HTML中一样,它们是可查看的 如果我理解正确的话,“[隐

我正在寻找关于如何以安全的方式在客户端和服务器之间来回传递id的建议或真正好的教程,我不会传递用户id或类似的东西,但是我可能会传递项的id表行。我想对用户隐藏这些ID。我希望我可以避免将它们放在页面中,但是考虑到它们是pk,我别无选择,只能在客户端和服务器之间来回传递值

谢谢你的帮助


编辑:我计划检查用户是否拥有执行此类操作的权限,但是我仍然希望隐藏数据。

正如您所提到的,将项目表行的主键输出到视图中不是一种理想的做法,就好像它们在页面的HTML中一样,它们是可查看的

如果我理解正确的话,“[隐藏]这些ID不让用户看到”,我猜你的意思是以某种方式混淆ID,因此即使它们是从视图的HTML中获取的,它们在各自的上下文中也没有什么意义

实现上述目的的一种方法是使用ViewModel将绑定的数据输出到视图,但在特定的ViewModel类中,您可以使用一些自定义属性逻辑来使用AES(双向)加密算法对PKs进行编码,用于加密的salt仅为您(和您的服务器)所知

这是在视图中“保护”PKs的一种方法

使用这种方法,您可能需要考虑在来回乒乓传输数据时加密/解密PKs的性能开销

如果您选择加密路线,则可能会对此感兴趣:


通过内存(缓存或会话数据)键值查找,可以将任意数字作为ID输出到每个表项的视图中,并且从视图中检索时,从内存集合反向查找PK,也可以在不加密的情况下实现更高的不透明度。

如您所述,将item表行的PK输出到视图不是一种理想的做法,因为如果它们在页面的HTML中,它们是可查看的

如果我理解正确的话,“[隐藏]这些ID不让用户看到”,我猜你的意思是以某种方式混淆ID,因此即使它们是从视图的HTML中获取的,它们在各自的上下文中也没有什么意义

实现上述目的的一种方法是使用ViewModel将绑定的数据输出到视图,但在特定的ViewModel类中,您可以使用一些自定义属性逻辑来使用AES(双向)加密算法对PKs进行编码,用于加密的salt仅为您(和您的服务器)所知

这是在视图中“保护”PKs的一种方法

使用这种方法,您可能需要考虑在来回乒乓传输数据时加密/解密PKs的性能开销

如果您选择加密路线,则可能会对此感兴趣:

通过内存(缓存或会话数据)键值查找,可以将任意数字作为ID输出到每个表项的视图中,并且从视图中检索时,可以从内存集合中反向查找PK,从而在不加密的情况下实现更高的不透明度。

简单建议:

1) 向生成的表中添加guid列(默认值:new id())。在guid列上创建索引。来回传递guid而不是PK

2) 这能完全保护你的身份证吗?不会。但它可以防止用户猜测数字PK

3) 始终检查经过身份验证的用户是否有权访问记录。

简单建议:

1) 向生成的表中添加guid列(默认值:new id())。在guid列上创建索引。来回传递guid而不是PK

2) 这能完全保护你的身份证吗?不会。但它可以防止用户猜测数字PK


3) 始终检查经过身份验证的用户是否有权访问该记录。

您确实应该在服务器上执行安全操作。用户有权访问的任何记录都应该可用,而他们无权访问的任何记录都不应该可用。他们是否知道ID是什么并不重要,因为他们无论如何都可以访问数据。他们可以通过黑客攻击做任何事情,他们可以在UI中做任何事情


因此,试图隐藏它们是毫无意义的。

您真的应该在服务器上执行安全保护。用户有权访问的任何记录都应该可用,而他们无权访问的任何记录都不应该可用。他们是否知道ID是什么并不重要,因为他们无论如何都可以访问数据。他们可以通过黑客攻击做任何事情,他们可以在UI中做任何事情


因此,试图隐藏它们毫无意义。

您可以使用MVC安全扩展项目

说你要保护的字段是Id

在控制器post方法上添加:

[ValidateAntiModelInjection("Id")]
在视图中添加:

@Html.AntiModelInjectionFor(m => m.Id)
@Html.HiddenFor(m => m.Id)

发布时,您的Id字段将被验证。

您可以使用MVC安全扩展项目

说你要保护的字段是Id

在控制器post方法上添加:

[ValidateAntiModelInjection("Id")]
在视图中添加:

@Html.AntiModelInjectionFor(m => m.Id)
@Html.HiddenFor(m => m.Id)

在post上,您的Id字段将被验证。

这可能有点误导您。只是澄清一下MD5是一个单向加密哈希函数。它不能用于加密或编码数据的方式,可以解码。它生成一个哈希值,可用于验证数据。您完全正确@zapthedingbat,感谢您纠正我的错误观念!在这种情况下,使用双向加密算法(例如,使用哈希)是否可以证明上述情况,这是一种非常好的方法,可以确保所呈现且必须回放的值未被篡改。这正是ASP.NET中ViewState验证的工作方式。如果你只想确保