2

我正在编写一个 GWT 应用程序,用户可以在其中登录并与他们的个人资料进行交互。我知道每个表单条目都需要在服务器上进行验证,但是,一旦用户登录,我不确定潜在的安全问题。

让我解释。我的应用程序(相关部分)的工作原理如下:

1 - 用户输入电子邮件/密码
2 - 将此信息发送回服务器,查询数据库,检查密码(已加盐和散列)
3. 如果密码与电子邮件相关联的配置文件匹配,则认为这是成功

现在我不确定将配置文件 ID 传递回客户端是否安全,然后它将用于查询数据库以获取与用户相关的信息,以显示在配置文件页面上。

潜在用户是否有可能手动提供此配置文件 ID 并以这种方式加载配置文件?我担心的是,如果他们知道配置文件 ID 的格式,那么怀有恶意的人可能会在不提供凭据的情况下从我的数据库中加载任意数量的信息。

-缺口

4

4 回答 4

3

您在这里处理的是会话管理问题。理想情况下,您需要一种方法来跟踪登录用户(使用随机值作为会话密钥),知道他们空闲了多长时间,能够在用户使用站点时扩展会话,以及使会话过期。

仅将配置文件 ID 传递给客户端,并依靠它为每个请求将其发回是不够的 - 您的担忧是正确的。

您希望在数据库中保留具有到期时间的会话列表。每次执行需要用户权限的操作(应该是几乎所有内容)时,检查会话是否仍然有效,如果是,则将其延长你想要的时间。如果它已过期,请完全终止会话并将用户注销。

您可以将会话密钥存储在 cookie 中(您必须在某些时候信任客户端),但要确保它们是非确定性的并且具有非常大的密钥空间,因此不会被强制获取有效会话。

于 2012-12-27T20:40:07.803 回答
0

潜在用户是否有可能手动提供此配置文件 ID 并以这种方式加载配置文件?我担心的是,如果他们知道配置文件 ID 的格式,那么怀有恶意的人可能会在不提供凭据的情况下从我的数据库中加载任意数量的信息。

Stefan H 是正确的,如果您的会话密钥不可猜测且不可修复可以通过会话管理解决此问题。

另一种解决方法是使用加密原语来防止篡改 ID。

例如,您可以在您的服务器上存储一个私钥并使用它来签署配置文件 ID。在后续请求中,如果通过签名检查,您的服务器可以信任配置文件 ID。

于 2012-12-27T21:55:27.073 回答
0

正如 Stefan H. 所说,由于您正在登录用户,因此您必须使用支持会话(PHP、.Net、JAVA 等)的后端。这意味着您不应该在客户端保留任何 id,因为简单的 id 替换可能会授予我对另一个用户帐户的完全访问权限(当然,这取决于您在客户端上公开的功能)。

为登录用户获取敏感信息(或任何管理操作)的任何服务器请求应类似于 getMyCreditCard()、setMyCreditCard() 等(请注意,没有传入唯一 ID)。

于 2012-12-27T21:09:57.860 回答
0

规则 1 - Avoid cooking up your own security solution and use existing tested approaches

规则 2 - 如果您的服务器端是 java,那么您应该按照 jsessionid 的思路思考。Spring Security 将为您提供一个良好的起点来管理具有附加安全功能的会话 ID。php 中也会有类似的现有框架(我没有在问题中看到服务器端语言标签)。

规则 3 - 使用 GWT,您会在 Google 团队文档中遇到基于 javascript 的安全问题,并建议 XSRF 和 XSS 安全预防步骤。参考 - https://developers.google.com/web-toolkit/articles/security_for_gwt_applications

于 2012-12-28T03:34:28.143 回答