16

假设我正在使用meteor.js 构建一个应用程序,我只是从用户那里收集一些简单的表单数据。也许是一个简单问题的答案之类的。他们无需登录即可提交数据。

如何保护我的应用程序免受有人在他们的 Chrome 控制台中创建 js-loop 的影响,而后者只是将垃圾插入到我的数据库中?


我可以通过这样做来保护删除和更新:

Formanswers.allow({
  insert: function () {
    return true;
  },
  update: function () {
    return false;
  },
  remove: function () {
    return false;
  },
});

如果用户已登录(您记得在我的应用程序中不是这种情况),我可以为每个插入添加时间戳并检查如下内容:

  insert: function (userId, doc) {
        if (userId && (Formanswers.findOnd({userid: userId, time: SOMETHING TIME SPECIFIC}).count() < 1)) return true;
  },

所以我的问题是:有没有其他方法可以为匿名(未登录)用户获取唯一的 userId-thing 或 IP-address 或其他东西,这样我也可以对他进行上述检查?

谢谢!

4

4 回答 4

12

You can use a meteorite package.

accounts-anonymous

https://github.com/tmeasday/meteor-accounts-anonymous

So you use

Meteor.loginAnonymously();

if the user visits your page for the first time, and use .allow to check what you need

于 2013-02-08T05:24:44.710 回答
1

要获取 ip 地址,天文台 ( https://github.com/jhoxray/observatory ) 项目使用这个:

在咖啡中:

Meteor.userIP = (uid)->
  ret = {}
  if uid?
    s = ss for k, ss of Meteor.default_server.sessions when ss.userId is uid
    if s
      ret.forwardedFor = s.socket?.headers?['x-forwarded-for']
      ret.remoteAddress = s.socket?.remoteAddress
  ret

它返回一个像{ forwardedFor: '192.168.5.4', remoteAddress: '192.168.5.4' }

于 2013-04-01T22:19:04.223 回答
0

使用会话或本地存储密钥。当访问者提交表单时,检查是否已设置密钥,如果已设置,则拒绝插入。

于 2013-02-07T16:15:16.713 回答
0

你可以这样做:

if (Meteor.isClient) {
    Meteor.startup(function () {
        Session.set('currentuser', 'something randomly generated by another function');
    }
}

并检查“当前用户”是否已插入您的数据库。

于 2013-02-07T16:18:49.790 回答