文章

2047日志为什么要记录用户salt和IP地址?

我在2047的开源代码中,发现有两处代码会关联用户身份和IP地址。如果我没理解错的话。

第一处的代码位置在:

https://github.com/thphd/2047/blob/master/api.py

第358行。源代码为:

aql('''for i in invitations filter i._key==@ik
        update i with {active:false, ip_addr:@ip, salt:@salt} in invitations''', ik=ik, ip=g.display_ip_address, salt=salt)

数据库操作是Arango DB的查询语言。g.display_ip_address是显示在网页右下的IP地址。我没理解错的话,这一步会将用户的IP地址和密码盐写入数据库。由于用户的盐是唯一的,知道盐就相当于知道用户身份。因此这一步相当于关联了用户IP和身份并记录。

这个GitHub版本是:

https://github.com/thphd/2047/blob/e00a6108ef1e001ca0f0f81b35f8536008f91fbb/api.py


第二处的代码位置在:

https://github.com/thphd/2047/blob/master/main.py

第897行-901行。源代码为:

# now seems you're not logged in. we have to be more strict to you
salt = g.session['salt'] if 'salt' in g.session else '==nosalt=='

if not is_static:
    log_info(ipstr, 'browser' if g.using_browser else '==naked==', salt)

ipstr就是显示在网页右下的IP地址,salt是用户盐,可以唯一的标识用户。因此,log_info()这个函数,对用户发起的每一次请求,都记录了发起请求的用户身份和IP地址。

这个GitHub版本是:

https://github.com/thphd/2047/blob/b8b2116c015dbb97ecec9b6ae3d2e11ed6c68f72/main.py

保存日志用于维护可以理解,但不能理解同时记录用户salt和IP有任何必要。

菜单
  1. 习包子总皇帝 总加速师
    习包子总皇帝   00后反贼,日常辱包,支持中国走向自由民主。多亏了习近平。不同意他连任的请举手?没有没有没有!

    顶,顺便问问为什么这里的时间记录都精确到秒? 这样,用户的风险是不是比品葱膜乎更大一些?

  2. thphd   2047前站长

    谢邀

    1. The "salt" is unique to each session(based on cookies) and we have to use sessions to identify one user from another. Your "salt" will change if you:

      1. clear cookies
      2. use a different browser
      3. restart browser/change identity (in case of Tor)

      Session(cookies) are used widely throughout the Web. For example, Pincong and Mohu use session(cookies) to identify you as one of their users.

    2. It's impossible to tell one's real-life identity via his "salt" since that's generated from an RNG. No it's not a hash of some string. An attacker would not be able to use that information to identify our users on sites other than 2047. That's why it's safe to store "salt" in the database.

    3. "salt" will be stored ONCE in the database during registration. This stored version of "salt" becomes irrelevant as soon as the user changes his "salt" via above means.

    4. Now let's talk about IP addresses. If someone registers multiple accounts (for trolling or whatever), the only way to identify this pattern other than using "salt" would be to use his IP address. We do record IP addresses ONCE during registration to prevent spam/trolls from downgrading our users' experiences. This IP address will become irrelevant pretty soon if you're using VPN/Tor.

    5. We delete IP addresses from our database on a monthly basis.

    6. Our CDN provider Cloudflare WILL keep a record of the IP addresses of the visitors. We can't afford to own our own CDN, at least for now. This is considered acceptable by most Pincong/Mohu users.

    7. If you want to prove that the code running on our server is actually the same as what you saw on Github, we'll have to employ something like this. Until then, choose wisely who you trust.

  3. thphd   2047前站长

    btw, log_info(foo) prints foo to stdout which happens to be a terminal.

  4. thphd   2047前站长

    @习包子总皇帝 #117945

    顶,顺便问问为什么这里的时间记录都精确到秒? 这样,用户的风险是不是比品葱膜乎更大一些?

    They'll know you're from China, but that's all.

  5. thphd   2047前站长

    中文版本

    1. 广场的理解有误。salt是随机数,随session变,并非用户唯一,不存在“知道salt就知道用户身份”的说法。

    2. 广场把salt误解为密码盐,其实密码盐在代码中的另一处。

    3. 广场的理解有误。log_info()会输出到terminal而非存log,所以这个帖子标题是错的

    4. 我们不会记录日常使用IP,但会记录注册IP,每月清一次。用VPN或者Tor的用户可以忽略这个问题。作为网站运营方,我们必须在消灭troll/spam和保护用户隐私之间寻找一个平衡,之前1117特大网暴案,还有几次未立案的troll行为,都是靠这种方式侦破的。

    5. 我们接受各种技术上的质疑,但是我们有一个最根本的限制,那就是我们没有办法证明服务器上运行的代码就是你在github上看到的代码。

      比如说品葱记录了用户的所有IP地址,但是它并没有把这些代码commit到github上,所以没有人会吐槽品葱;我们只是临时记录注册地址以防止troll/spam,但我们把这些代码commit到github上了,所以就被人吐槽。在这个不对称的游戏里,越诚实的人越吃亏,闷声发大财是最好的。

      作为对这个不可证明性的弥补,我们始终建议所有用户使用Tor访问2047.

    6. 品葱(膜乎)采用的是第三方的方式,通过hcaptcha去拦截bot,实际上就把注册者的IP地址透露给了hcaptcha,但广场并未提出质疑,即使hcaptcha的代码并不是开源的。

    7. 所以这些问题归根结底还是要靠人际信任,我说实话吧,这些事情我作为站长,有太多地方可以造假,开源代码是为了方便大家debug,不是用来自证清白的,我完全可以在开源代码之外另搞一套代码来记录各位的IP地址,总之只要用户不信任我,我是没有办法自证清白的。

  6. 爱狗却养猫 饭丝
    爱狗却养猫  

    这些问题很重要。谢谢广场的提出,也谢谢站长的解答。希望其他技术人士能够验证这些说法,例如salt和用户身份的关系。

    我还有些问题,主要关于IP。IP的问题虽然用Tor可以解决,但对于很多用户来说仍然是个很大的顾虑。站长的英文回复中提到,“Our CDN provider Cloudflare WILL keep a record of the IP addresses of the visitors”,就是说Cloudflare会记录所有访问者IP,那么站点控制者(如站长)是否可以通过某种方法抽取Cloudflare所记录的IP查看?还有关于hcaptcha问题,请问设置hcaptcha的人是否有办法知道完成hcaptcha的访客的IP地址?

    在这个不对称的游戏里,越诚实的人越吃亏,闷声发大财是最好的。

    虽然是这样,但是在闷声发大财和诚实吃亏之间,后者才是长期信任的根本。所以我建议把可能会引起用户安全顾虑和质疑的设置(例如salt和IP相关问题)进行透明的声明,告知用户这些设置的原因和含义,并给出隐私保护建议,保障用户知情权和选择权。即使有短期的“吃亏”,也是值得的。

  7. 用爱心说实诚话 PUA祖师爷
    用爱心说实诚话  
    内容已隐藏
    内容已被作者本人或管理员隐藏。 如有疑问,请点击菜单按钮,查看管理日志以了解原因。
  8. 爱狗却养猫 饭丝
    爱狗却养猫  

    @thphd 秉持透明原则,我冒昧多说一句,我理解你说的记录注册IP一个月能帮助辨识troll/spam/attacker,此外作为站点控制者本身必然知道所有访问者IP(且是否记录、记录多久没法证明);但是如果有可能,我希望站长能够将注册者ip在记录前,以某种非可逆形式转码,形成unrecognizable but unique identifier。这样既可以防spam,也无法通过数据库知道原来的ip(以应对万一情况)。Again,站长究竟做什么,只能基于信任,我自己的安全根本来讲要自己负责;我基于信任,相信2047的实际代码=github公开代码;也基于信任,希望站长在站点设置方面提供更多的隐私保护。

  9. thphd   2047前站长

    @爱狗却养猫 #117991

    以某种非可逆形式转码,形成unrecognizable but unique identifier。这样既可以防spam,也无法通过数据库知道原来的ip

    cryptographic_hash(ipv4) is very reversible

  10. 沉默的广场  

    @thphd #117958 谢谢回答。之前部分代码确实理解有误。因为我没有在本地搭建论坛程序,发本贴是为了尽量核实我对代码的一些疑问。我总结一下:

    已证实本贴有误的地方:

    • main.py中的salt随session变化,而非密码盐。

    • 经试验,log_info()调用app.logger.warning(),最终输出到stdout。app实例由Flask()工厂函数生成,本质是python的logger。

    stdout可以重定向,当然讨论这个没有意义。因为只从后端代码讨论没有用,最后仍然要靠大家对站方的信任。

    证实的feature:

    • 注册时会记录IP以防止spam,记录保存一个月。(用户协议里其实有提到)

    可能和品葱WeCenter的“注册频率限制”差不多,都是基于IP的防spam机制。

  11. 邹韬奋 外逃贪官CA
    邹韬奋   虽然韬光养晦,亦当奋起而争(拜登永不为奴:h.2047.one)

    @爱狗却养猫 #117991 这个没有办法的,你只能假定thphd是网警设了蜜罐2047,你所能做的就是在假定thphd是网警的情况下保护自己。