我正在编写一个Asp.Net WebForms应用程序,我在其中调用一个编辑页面,使用URL中的查询字符串参数传递有关要编辑的记录的数据。
像:
http://myapp.path/QuoteItemEdit.aspx?PK=1234&DeviceType=12&Mode=Edit
在应用程序的上一页中,我向用户展示了他可以根据自己的帐户权限编辑的筛选项目的GridView,并使用以上参数列表调用编辑页面,页面知道该怎么做。我不会对目标页面进行任何额外的检查,以验证用户是否可以访问传入的PK记录值,因为我打算依赖上一页来过滤列表,我会没事的。
但是,显然用户现在可以键入不同PK的URL并获得编辑该记录的访问权限。 (或者,他可以访问Mode = View,但不能访问Mode = Edit或Mode = Delete。基本上,我希望避免验证目标页面上的记录和访问权限。
在调用目标页面之前,我还使用Session变量测试了相同的工作流程来存储PK,DeviceType和Mode,然后在目标页面中从Session中读取它们。因此没有涉及查询字符串参数。这将控制远离用户。
所以,我正在寻找关于这两种方法的反馈,以便我选择一种可接受/标准的方式来处理这个问题,因为它似乎是CRUD应用程序非常常见的应用程序设计模式。
答案 0 :(得分:6)
同意,您需要验证目标页面上的权限,这是绝对确定的唯一方法。在安全性方面,冗余并不是一件坏事。保护您的数据库,就像您不信任业务层一样,保护您的业务层,就好像您不信任UI一样,并保护用户界面。
答案 1 :(得分:2)
在实际执行操作之前,您应始终验证,尤其是在通过查询字符串传递参数时。对于执行执行的第二个页面,您可能不需要为用户提供尽可能多的反馈,因为如果他试图破坏您的安全性,则不必对用户友好,因此错误处理应该更容易。
每个会话传递变量是可以接受的但是 imho你仍然应该验证这些值。
答案 2 :(得分:2)
我们总是使用查询字符串,因此可以轻松地将记录加入书签,但是在两个地方始终都可以验证,如果您很好地为您编写访问控制代码,那么它应该只是重新使用现有代码...
答案 3 :(得分:1)
我认为通常的做法是做你要避免的事情:在原始页面上,你需要检查用户应该具备的功能,并适当地显示他们的选项。然后在实际工作页面上,您需要再次检查用户以验证他们是否可以访问该用户,并且可以访问该特定任务。
从可用性的角度来看,这是用户想要的(保持简单,允许他们为某些页面添加书签等),并且两个页面上的安全性是唯一的方法。
答案 4 :(得分:1)
如果您确实不想检查目标页面上的访问权限:
您可以使用UserID对PK进行哈希处理,然后将哈希值添加到查询字符串中。
string hash = hashFunction(PK.toString() + UserID.toString());
然后,您必须确保queryString中的哈希值等于在加载页面之前计算的哈希值。
假设这是一个内部组织Web应用程序。
答案 5 :(得分:0)
会话变量也可以被操作,尽管不那么容易。无论您在整个网站中使用何种身份验证,您都应该在目标网页上使用。否则,您将接触到您可能不想要的数据,因为您已经找到了。
答案 6 :(得分:0)
您可以执行以下操作以使您的网址更安全:
- 使用主键的Guids,以便用户无法猜出其他记录ID
- 模式可以暗示:Guid =编辑,没有Guid =新
和..
- 服务器端验证是唯一的方法。