以下是我的情况:
我有一个从数据库中提取数据的搜索页面。显示的每条记录都附有一个密钥,以便从该数据库中为该记录提取数据。单击指向记录文档的链接时,使用KO data-bind将该键添加到URL,并将控制权传递给相应的MVC Controller。
这是我的问题:
该密钥显示在URL中。我不能允许。本网站的用户只能访问某些记录。如果用户只需更改URL中最后一个或两个密钥就能看到任何记录,这是不可接受的。到目前为止,我提出的最佳解决方案是在处理搜索结果时使用AES256加密来加密每个密钥,然后在加密传递给另一个控制器后解密。这很有效,除非我到达使用HTTPS的环境。我得到了400个错误。
我是否过度思考这个?有没有办法,使用MVC和KO,完全掩盖URL中的密钥?或者,即使使用HTTPS,也应该在URL中加密?
以下是一些澄清的例子:
我的代码没有任何更改,以下是URL的外观:
使用加密,我想出了类似的东西:
只要它适用于HTTPS,这样就可以正常工作。
不管怎样,我需要对URL中的密钥进行加密或者删除它。或者确定每次调用控制器时都不使用密钥运行搜索的方法。
谢谢大家的帮助。
答案 0 :(得分:3)
除非我在这里遗漏了一些非常明显的东西,否则你不能在网络服务方面查看登录用户是否拥有对记录的正确权限,如果没有,则不显示记录?
理想情况下,这应该在搜索级别完成,因此用户无法看到任何无法访问的文件。即使他们更改了浏览器中的密钥,他们仍然无法访问。
如果没有会员制,那么如果你真的想让你的网站安全,就需要实施一个。否则,你正在玩火。否则,您将需要将文档设置为“公共”或“私有”,其中仍然需要进行数据库级更改。
修改强>
如果确实需要使您的ID不可用,请不要对它们进行加密,更简单一些,并在数据库级别为它们创建GUID。然后,您的URL将包含GUID而不是加密密钥。由于您不必在每次通话时加密/解密记录ID,因此效率会更高。
然而,这仍然不是100%安全,我怀疑是否会通过PCI数据安全检查,因为人们仍然可以查看(并复制/粘贴)查询字符串中的GUID,就像加密字符串一样容易。实际上,您需要一个完全符合会员制的系统。
答案 1 :(得分:0)
我同意迪克森。您应该检查用户是否有权查看任何项目。
我也同意使用GUID是一个好主意。
但是,如果你把int作为id吮吸,这里有一个简单的方法:创建URL时:将id乘以一个大整数,例如12345.然后在处理请求时,将URL中的数字除以你的“秘密”号码。这不是万无一失的。但是一个人猜测只有很小的机会获得一个真实的身份证 - 特别是12345获得真实身份证的机会。