使用javascript

时间:2019-06-08 14:31:30

标签: javascript cookies

我不确定是否有可能,但是有一种方法可以在仅使用javascript的情况下确保跨多个页面的用户信息安全?

我从三个单独的API请求中恢复了一组预定义的详细信息,初始调用通过POST将用户凭据发送到login_api,并返回一小组数据(OAuth2令牌,用户出生名称等),随后的调用成功通过GET调用触发2通道产品时,这些请求将返回每个通道的产品列表,这被视为该用户有权查看的产品。

我在建立安全的用户身份验证和在多页网站上记住数据方面没有丰富的经验,因此我想确保我采用的是正确的方法。

通过下面的函数,我可以在利用该数据的函数内部创建_private变量。

所有记住的数据都在XHR响应中应用到cookie存储区域,它永远不会离开请求功能的范围。

从那时起,将通过cookie检索所有数据,这些cookie在单个函数范围内使用,而不会离开使用该函数的函数的范围。每次需要数据时,都会从cookie中重新获取数据。我不确定cookie的安全性,我曾讨论过每次恢复数据时都要清除cookie,并在函数完成后重新应用更新的值,但是我认为它过大了。

如果页面加载中不存在任何相关的cookie数据,它们将被重定向到登录页面,并且所有相关的cookie数据(如果存在)都将被删除。

是否有任何方法可以改善在多个页面上保留OAuth2令牌和少量用户详细信息,而不会仅使用javascript泄漏用户信息?

注意 这是在一个比较老的内部网站内,并且为了使我们正在使用ES5及以下版本的团队熟悉这些内容,它已不再是内部使用。

var config = Object.create(null);
config.expire_item = 30; // minutes

function dataref() {

  // setup objects to store details in
  var output;
  output = Object.create(null);
  output.access = Object.create(null);
  output.licensed = Object.create(null);
  output.token = "_token"; 

  // apply predefined names as object values
  // cookies in this namespace holds user name
  output.fname = "_fname"; 
  // cookies in this namespace store true/false flags
  output.has_access.ces = "ces_license";
  output.has_access.ezg = "ezg_license";
  // cookies in this namespace hold pipe & comma delimited product lists
  output.licensed_for.ces = 'ces_products'; 
  output.licensed_for.ezg = 'ezg_products';
  // ...etc.

  return function () {
    // return object with predefined names for cookies
    return output;
  }();

}

function apply_userdata(fn) {
  // get predefined cookie names
  var _data = dataref();
  return function () {
    // apply function to all namespaces
    fn(_data.token);
    fn(_data.fname);
    fn(_data.access.ces);
    fn(_data.access.ezg);
    fn(_data.licensed.ces);
    fn(_data.licensed.ezg);
  }();
}

function resetCookieExpire(name) {
  // updates cookie expiration period.
  return setCookie(name, getCookie(name), option.expire_item);
}

function getUserSensativeData(name) {
  // retrieve cookie value
  return getCookie(name)
}

function deleteUserSensativeData(name) {
  // remove cookie name/value
  return deleteCookie(name);
}

1 个答案:

答案 0 :(得分:1)

我应该以“我也不是认证专家”作为开头,但是过去我在多个项目中使用几种不同类型的用户认证。您所说的内容似乎隐含了一些丢失的信息,但您似乎正在使用oauth2隐式流或oauth2授权代码流。在任何一种情况下,为了在不同的页面加载中保持一致,除非您是单个页面应用程序,否则您必须像现在一样使用cookie或本地存储,在这种情况下,听起来好像不是。 根据您对这个项目的描述方式,听起来好像您正在尝试终止该项目,也就是说,如果您真的对存储这些客户端凭据感到不满意,可以切换到使用secure = true; httpOnly的OIDC样式流程= true cookie,将随每个请求自动发送。听起来这不是您的选择。 Oauth2被认为是安全的,并且存储可重复使用的客户端凭据不会“违反”任何规则。可以将存储客户端凭据的漏洞视为易受攻击的原因是由于XSSCSRF攻击

拥有内容安全策略也要走很长的路要走。

您还可以采取其他预防措施,例如具有较短的到期时间(通常为1小时),甚至可以在紧急情况下手动使access_tokens到期。希望这会有所帮助。