在编辑视图中保留实体密钥的更安全方法?

Posted

技术标签:

【中文标题】在编辑视图中保留实体密钥的更安全方法?【英文标题】:A more secure way to persist entity key in an edit view? 【发布时间】:2015-07-11 02:43:54 【问题描述】:

我总是对在我的视图中使用隐藏的输入来存储实体键存有疑虑。即使是好奇的用户也很容易在浏览器控制台中编辑此值,并可能最终更新该用户不应访问的实体。

有没有一种可行的方法可以在视图中保留这个值,而不会增加太多的加密等复杂性?

【问题讨论】:

This article 讨论了一种防止篡改隐藏字段的方法,但无论如何您都应该检查用户是否有权编辑/访问控制器中的实体 如果您担心有人篡改隐藏字段,那么您可以将其放在Session 中,然后在发布后检查发布的值是否与Session 值匹配。正如@StephenMuecke 所说,如果您的安全性需要如此严格,那么应该在您的业务逻辑中检查此级别的编辑权限。 您不应依赖客户端的任何类型的混淆或验证。唯一的解决方案是验证当前用户是否拥有编辑发布实体的所有权限。 【参考方案1】:

将其保存在 javascript 变量中。然后在回发时创建一个 js 函数并在那里最合适地使用它(如果您使用 AJAX 回发应该很容易;))

【讨论】:

【参考方案2】:

你可以做两种方法:

1st for Encryption
2nd for Decryption

(或者你可以根据参数做一个加解密组合的单一方法)

So, encrypt you query parameters in your GET Method. 
And decrypt you query parameters in your POST Method.

您也可以自定义ActionFilterAttribute 来解密您的加密查询参数。 还有更多的方法可以解决这个问题,但这太简单了,无法作为第一步来实现。

例子:

public enum EncryptType

   ENCRYPT,
   DECRYPT
;

public string EncryptDecrypt(EncryptType encType , string strtext)

            string result = string.empty;
            if (encryptionType == EncryptType.ENCRYPT)
            
                 result = //Do Encryption on strtext
            
            else if(encryptionType == EncryptType.DECRYPT)
            
                result = //Do Decryption of strtext
            
            return result;

【讨论】:

简单且最好的安全第一步。【参考方案3】:

基本上所有来自客户端的输入都可以被客户端修改,并且应该被视为不受信任。

即使您在会话中加密、散列和存储散列或以其他方式混淆 id 值,您仍然没有正确处理访问控制。

如果其他用户通过任何方式获取混淆值,然后使用他们自己的凭据/cookie 提交该有效值,您将如何处理它?

如果您在登录用户发出请求时没有检查是否允许他们访问指定资源,那么您的应用程序仍然会被滥用。

混淆值与执行访问控制检查的开销有多大?与其说是硬件性能,不如说是开发人员的精神负担、调试、代码审查。

【讨论】:

以上是关于在编辑视图中保留实体密钥的更安全方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sonata Admin 编辑视图中自定义实体关联的 SQL 查询

编辑带有子实体选择列表框和 HTTPPost 困难的视图

更新映射到视图的实体框架实体

使用多个视图在 QML 中查看、编辑和更新数据(来自 C++),而数据保留在 C++ 中(订阅数据)

android如何跨片段分离/附加保留视图状态

如何根据位置从“回收”视图中删除Firebase数据库密钥