确保客户端对集合的访问安全

2023-12-06

我有一个运行良好的流星应用程序原型,但目前非常不安全:我需要显示与当前登录用户匹配的用户列表。首先,我决定发布所有用户,将字段限制为过滤客户端用户列表所需的字段。

Meteor.publish('users', function () {
  return Meteor.users.find({}, {
    fields: {
      'profile.picture': 1,
      'profile.likes': 1,
      'profile.friends': 1,
      'profile.type': 1
    }
  });
});

然后在我的路由器中,我会发出一个请求,仅在客户端显示我想要的内容:

Router.map(function() {
  this.route('usersList', {
    path: '/users',
    waitOn: function () {
      return Meteor.subscribe('users');
    },
    data: function () {
      var user = Meteor.user();
      return {
        users: Meteor.users.find({ $and: [
            {_id: {$ne : user._id}},
            {'profile.type': user.profile.interest}
          ]})
      };
    }
  });
});

在上面的代码中,我查询了所有非当前用户且类型与当前用户兴趣相对应的用户。我还使用以下客户端帮助程序在“profile.friends”数组中包含我的用户的用户的照片上显示特定边框:

Template.userItem.helpers({
  getClass: function(userId) {
    var user = Meteor.user();
    var lookedup = Meteor.users.findOne({_id: userId});
    if ($.inArray(user._id, lookedup.profile.friends) !== -1)
      return "yes";
    return "no";
  }
});

现在这一切都工作得很好,但是通过这个设置,每个客户端都可以查询每个用户并获取他们的类型、图片、朋友列表和喜欢的数量。如果我在 MVC 中,则只能在服务器端访问此信息。所以我决定下一次迭代是安全迭代。我会将查询从路由器文件移至出版物文件。这就是麻烦开始的地方......

Meteor.publish('users', function () {
  var user = Meteor.users.findOne({_id: this.userId});
  var interest =  user.profile.interest;
  // retrieve all users, with their friends for now
  allUsers = Meteor.users.find({ $and: [
      {'_id': {$ne: user._id}},
      {'profile.type':interest}
    ]},
    { fields: {'profile.picture': 1, 'profile.friends': 1}}
  );
  return allUsers;
});

在路由器中:

Router.map(function() {
  this.route('usersList', {
    path: '/users',
    waitOn: function () {
      return Meteor.subscribe('users');
    },
    data: function () {
      var user = Meteor.user();
      return {users: Meteor.users.find({_id: {$ne : user._id}})};
    }
  });
});

(请注意,我仍然需要从路由器查询中排除当前用户,因为当前用户始终是完全发布的)

这有效,but:

  1. 当我更改用户兴趣然后执行操作时,用户列表不会更新Router.go('usersList')。仅当我刷新浏览器时,我的列表才会根据用户的新兴趣进行更新。不知道为什么。
  2. 该解决方案仍然发布用户的朋友,以便显示我的匹配边框。我希望在我的发布查询中添加一个临时字段,如果用户在用户的朋友中,则将其设置为“是”,否则设置为“否”,但是......到目前为止还没有成功。我读到我可以使用聚合来实现这一目标但到目前为止还没有成功。此外,聚合不会返回出版物所期望的游标。

这个问题让我对 Meteor 是否适合安全应用程序的赞誉产生了怀疑……这在 Rails 或其他应用程序中很容易实现!

编辑:根据要求,这是我迄今为止将“匹配”检查转移到服务器的代码:

Meteor.publish('users', function () {
  var user = Meteor.users.findOne({_id: this.userId});
  var interest =  user.profile.interest;
  // retrieve all users, with their friends for now
  allUsers = Meteor.users.find({ $and: [
      {'_id': {$ne: user._id}},
      {'profile.type':interest}
    ]},
    { fields: {'profile.picture': 1, 'profile.friends': 1}}
  );
  // ------------- ADDED ---------------
  allUsers.forEach(function (lookedup) {
    if (_.contains(lookedup.profile.friends, user._id))
      lookedup.profile.relation = "yes";
    else
        lookedup.profile.relation = "no";
    lookedup.profile.friends = undefined;
    return lookedup;
  });
  // ------------- END ---------------
  return allUsers;
});

显然这段代码根本不起作用,因为我无法在 foreach 循环中修改游标值。但它给出了我想要实现的目标:为客户端提供一种方法来了解朋友是否匹配,而无需向客户端授予对所有用户的朋友列表的访问权限。 (而且,避免在显示期间为每个用户执行一个请求来询问服务器该特定用户是否与该特定用户匹配)


您可以添加转换函数并即时修改光标文档流星集合.find

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确保客户端对集合的访问安全 的相关文章

  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • Meteor 中的触摸事件

    我开始使用 Meteor 做的第一件事是开始为手机 平板电脑编写基于触摸的 Web 应用程序 以下是重现问题的方法 第一步 创建一个空白项目 meteor create touch example cd touch example mete
  • 使用 Meteor 进行就地编辑:无法读取 null 的属性“parentNode”

    我已设置就地编辑network模型 有两个输入字段 分别是title和description模型的 当用户单击标题时 它会切换 h2 的标签 h2
  • Meteor 抛出 throwIfSelectorIsNotId 异常

    运行某些代码时 Meteor 会抛出 throwIfSelectorIsNotId 异常 我有两个客户端运行相同的代码 当第二个客户端运行相同的代码时会引发异常 无法弄清楚这个异常的含义以及抛出的原因 希望有人能够解释一下 对于客户端上的某
  • Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

    我在 Amazon S3 上使用 getObject 和 putObject 请求 并在创建访问存储桶的策略时发现 如果我不允许 listBucket 则会收到 访问被拒绝 错误 这样做的问题是 listBucket 意味着用户可以列出存储
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • ActiveMQ发送ObjectMessage

    我正在使用 ActiveMQ 在我当前的项目中实现消息系统 我需要发送和接收 Java 对象 而不是简单的文本或二进制消息 Java 对象 我的消息对象 根据需要实现了 Serialized 接口 ActiveMQ 的最新版本添加了一些安全
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 如何为移动应用程序创建无密码登录

    我有兴趣在移动应用程序和 API 之间构建某种无密码登录 假设我可以控制两者 动机是必须登录对用户来说非常烦人并且存在安全风险 例如 用户将重复使用现有密码 我希望用户能够立即开始使用该应用程序 我想知道是否有一些可行的技术 例如 在移动设
  • Mongo按动态字段排序

    所以我传入了一个动态变量 它是我想要排序的字段的名称 假设下面的 sortVariable 可能等于 price createdAt name 等 这不起作用 我该怎么做 function findStuff sortVariable va
  • 将 CCtray 与 Jenkins 结合使用,同时启用安全性(使用 HTTPS)

    我将 Jenkins 服务器配置为仅使用 HTTPS 并启用安全性 我也不喜欢任何未登录的人查看仪表板 即使它是空的 在这里 我禁用了 匿名 的 读取 访问权限 到目前为止 所有这些都完全符合我的喜好 但想要通过例如向远程客户端添加一些构建
  • 使用 Javascript eval() 100% 安全吗?

    我正在编写一个生成 Javascript 代码的 PHP 库 Javascript 代码有许多名为component001 component002 etc 页面通过 AJAX 动态加载 我需要通过 URL 变量传递组件的名称 然后由脚本进
  • 如何将环境变量 PACKAGE_DIRS 链接到我的本地私有包?

    我正在尝试设置一个环境变量 以便当我正在处理 Meteor 应用程序时 并且我想将本地私有包链接到我的项目 Meteor 将查找我在本地环境中创建的包目录 我做的第一件事是创建一个包目录并向其中添加一个基本的测试包 Users scotty
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • php 中的简单授权/登录功能

    我希望第一次实现用户登录到我的网站 我很高兴构建自己的解决方案 或者实现一些开源的东西 但是到目前为止 在我的搜索中没有任何包是明显的选择 同样 我完全意识到 作为一名中级 php 程序员 如果我推出自己的解决方案 并真正敞开大门 我很可能
  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 使用内联样式有哪些风险?

    A 内容安全政策 https developer mozilla org en US docs Web HTTP CSP with a default src or style src指令将阻止内联样式应用于
  • 使用 PBKDF2 和 SHA256 生成 128 位 AES 密钥是否安全?

    我想使用 PBKDF2 和一些加密哈希函数来生成 128 位 AES 密钥 SHA1 也是 128 位 所以我想将其与 PBKDF2 一起使用 但它已损坏 所以我选择使用 SHA256 这是否安全 或者散列大小和生成的密钥大小之间的差异是否
  • Windows DPAPI - 如何处理熵?

    我正在使用 Windows DPAPI 来加密一些敏感数据 密码存储在注册表中 这一切都运行良好 但我想知道是否有人可以澄清我对 NET 中 可选 提供给 ProtectedData Protect 的 熵 字节的理解 熵 字节数组似乎类似

随机推荐

  • C 中的隐式整数类型转换

    我了解 C 语言在整数和浮点类型之间的隐式转换 但我对有符号 无符号隐式类型转换有疑问 例如 如果您添加unsigned char and a signed int 结果类型是什么 这会是一个unsigned int a signed in
  • UISearchBarDelegate shownSearchResultsButton 属性的正确用法是什么?

    我将搜索栏配置为显示结果按钮 但该按钮仅在用户输入字符之前显示 此时 X 取消按钮将取代它 因此 无需输入字符 搜索结果集就等于整个数据集 我希望结果按钮保留在那里 这样当用户输入足够的字符以获得较小的结果集 例如 5 或 6 行 时 他们
  • JavaScript Prompt() 方法

    我正在处理一项任务 但我遇到了问题prompt 方法 我发现我可以做一个提示 但我需要多个提示 并且需要金额 例如 我创建了一个包含许多艺术家的 HTML 表以及包含 DVD CD 和音频的列 所有行中都有价格 我需要写一个提示来执行此操作
  • 如何按python pandas中的值范围列表进行分组[重复]

    这个问题在这里已经有答案了 我有以下数据框 name value a 100 b 200 c 150 d 300 e 400 f 200 g 100 我有范围列表 例如 0 100 100 200 超过 200 基于此 我必须计算上面数据框
  • 是否可以获取 XSD 中定义的 XML 节点的类型?

    我正在用 python 解析 XML 我有一个 XSD 架构来验证 XML 我能否获取 XSD 中定义的 XML 特定节点的类型 例如 我的XML 一小部分 是
  • 与全序相比,偏序是否足以构建堆?

    C std priority queue 只需要部分顺序 但如果它的实现是二叉堆 它是如何工作的 例如 假设我们有一个部分有序集 a b c x c lt b b lt a c lt a x与以下无关a b c 那么最大堆是 layer 1
  • RevMob sdk 5.9.0 在导入 时出现头文件错误

    我已经将 RevMobs 集成到我的项目中 现在我只需更新它并下载新的 sdk 5 9 0 并按照与之前相同的步骤进行操作并参考此链接 RevMob ios sdk 但现在我无法集成它并且在导入头文件时 import
  • Rails 存储第三方凭证。有人知道最佳实践吗?

    我读过一堆其他相关问题 似乎没有什么能真正回答我的问题 我的应用程序将与几个不同的第三方网站集成 ebay paypal google amazon 这是一个产品管理系统 它将产品推送到各地 当然 由于它与所有这些网站交互 因此需要用户名
  • 我们可以将语音识别框架与 Today Extension 结合起来吗

    我正在尝试构建一个带有语音按钮的小部件 当我按下它时 它应该将说出的语音转换为文本 但是 当我尝试录制语音时 AVAudioEngine 无法启动 是因为 Today Extension 中不允许 AVAudioEngine 吗 在互联网上
  • 设置具有对象 DataSource 的 DataGridView 中自动生成的列的格式

    我想自动创建我的所有列DataGridView基于我的自定义课程 每件事都按其应有的方式工作 但我需要的是格式化和对齐单元格值 那么是否有一个属性可以添加到我的字段 HeightMeter 中 以便它可以根据需要对齐和格式化 要在手动列创建
  • 编译日期和时间

    Java 中是否有相当于 C 和 C 编译时常量 DATE 和 TIME 的变量 我需要打印正在编译的程序的编译时间和版本信息 Thanks kodev19 据我所知 没有这样的事情 但是在运行的 JVM 上 您可以使用类似下面的代码直接从
  • TypeScript 中的递归泛型

    我想声明一个简单类型来替换any在一段代码中 我知道这将是一些类似对象的论证 所以我可以使用Record
  • Selenium Web 驱动程序 - 切换到父窗口

    我使用 selenium Web 驱动程序 我打开了一个父窗口 单击链接后 新窗口将打开 我从列表中选择一些值 此窗口会自动关闭 现在我需要在我的父窗口中进行操作 我怎样才能做到这一点 我尝试了以下代码 String HandleBefor
  • 正则表达式 - 匹配第 n 个字符,然后停止(非贪婪)

    尝试捕获此日志事件中的时间戳 对于 Splunk 172 21 201 135 http o 1I0BTOx1063x3667295x0 hkv 2020 06 10 17 43 18 951 POST rest build status
  • 弹出窗口触摸拦截器不工作

    我正在尝试测试 PopupWindow 类 我创建了这个方法来显示弹出窗口 public void showPopup LayoutInflater layoutInflater LayoutInflater getBaseContext
  • 多个线程持有同一个锁?

    dashboardRefreshContainer 8 Thread t 1384 java lang Thread State RUNNABLE at sun util calendar ZoneInfo getLastRule Zone
  • Delphi 中的 LZMA 或 7zip

    Delphi 中是否有任何库可以处理 LZMA 或 7zip 文件 包括创建自解压 EXE 有一些源代码在7zip org在 c java c 中 但我希望它们在 delphi 中 但我想要一些独立的东西 没有 DLL 有两种解决方案 1
  • R,按月分割数据

    我有带日期的数据 我想按所有事物所在的月份间隔对它们进行分组 所以说我有 date value 2015 04 01 1 2015 04 28 2 2015 05 04 3 2015 05 09 4 然后我想结束分组 1 2015 04 0
  • 当规则设置为“仅预览”时,Cloud Armor 日志不是很清楚

    我正在使用 Cloud Armor 部署 WAF 我意识到可以在 仅预览 模式下创建规则 并且 Cloud Logging 中有 Cloud Armor 条目 问题是 当我创建 仅预览 规则并且该规则与某些请求匹配时 我无法在日志中区分与某
  • 确保客户端对集合的访问安全

    我有一个运行良好的流星应用程序原型 但目前非常不安全 我需要显示与当前登录用户匹配的用户列表 首先 我决定发布所有用户 将字段限制为过滤客户端用户列表所需的字段 Meteor publish users function return Me