这对客户端代码安全吗?

时间:2012-12-27 20:31:48

标签: security gwt client

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

让我解释一下。我的申请(相关部分)的工作原理如下:

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

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

潜在用户是否有可能手动提供此个人资料ID并以此方式加载个人资料?我担心的是,如果他们知道配置文件ID的格式,那么有不良意图的人可以从我的数据库加载任意数量的信息而不提供凭证。

-Nick

4 个答案:

答案 0 :(得分:3)

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

简单地将配置文件ID传递给客户端,并依赖它来为每个请求发送回来是不够的 - 您对自己的关注是正确的。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

潜在用户是否有可能手动提供此个人资料ID并以此方式加载个人资料?我担心的是,如果他们知道配置文件ID的格式,那么有不良意图的人可以从我的数据库加载任意数量的信息而不提供凭证。

如果您的会话密钥为unguessableunfixable,则Stefan H是正确的,您可以通过会话管理解决此问题。

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

例如,您可以在服务器上存储私钥,并将其用于sign个人资料ID。在后续请求中,如果通过签名检查,您的服务器可以信任配置文件ID。

答案 3 :(得分:0)

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

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

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