在编辑视图中保留实体密钥的更安全方法?
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 查询