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

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

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

【问题讨论】:

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

标签: asp.net asp.net-mvc asp.net-mvc-5


【解决方案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 提交该有效值,您将如何处理它?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2021-06-10
      相关资源
      最近更新 更多