• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX  ›  程序员

php 如何对客户端 pc 生成唯一标识?

  •  1
     
  •   kisshere · Sep 17, 2014 · 13564 views
    This topic created in 4283 days ago, the information mentioned may be changed or developed.
    想对论坛发广告帖的用户浏览器做永久屏蔽,但目前用于标识客户端浏览器,用cookie,但是很容易被清理掉,php又没法获取mac地址,用evercookie貌似也应该能被清除,有没有更好的办法获取客户端浏览器唯一标识?
    71 replies    2014-09-18 19:31:52 +08:00
    Fedor
        1
    Fedor  
       Sep 17, 2014
    为什么要针对用户的浏览器? 直接针对用户如何?
    hging
        2
    hging  
       Sep 17, 2014
    屏蔽IP不就完了.
    kisshere
        3
    kisshere  
    OP
       Sep 17, 2014
    @Fedor 发广告帖的人,你删除了他的账户,他再注册一个账号继续发广告帖不就行了么?只能ban掉浏览器啊
    kisshere
        4
    kisshere  
    OP
       Sep 17, 2014
    @hging 更改个ip不就得了?
    holystrike
        5
    holystrike  
       Sep 17, 2014
    木有办法,专业发广告的浏览器都不用

    可以从限制广告内容入手,凡是检测到发类似内容的用户直接ban掉
    hging
        6
    hging  
       Sep 17, 2014
    @kisshere 那换个浏览器不完了. 再说伐广告的谁还用浏览器啊......
    superbear
        7
    superbear  
       Sep 17, 2014
    浏览器能干的,程序就能干。。。
    Fedor
        8
    Fedor  
       Sep 17, 2014
    看来获得账号的成本很低, 可否让账号获取的难度大些?
    注册12小时内不许发帖。
    发帖扣体力。
    ...
    找出他们和正常用户的差别, 使用一些不影响正常用户的策略, 应该能够给这些捣蛋的人带来一些困难。
    Actrace
        9
    Actrace  
       Sep 17, 2014
    MAC地址也是可以伪造的.
    最好的方法是根据用户行为进行策略上的防控.
    kisshere
        10
    kisshere  
    OP
       Sep 17, 2014
    @Actrace 能具体一点吗?
    cougar
        11
    cougar  
       Sep 17, 2014
    我觉得封ip最好,简单省事,他换ip也是要成本的,而封ip你的成本最低
    wdlth
        12
    wdlth  
       Sep 17, 2014
    先加个验证码呗……
    IFoon
        13
    IFoon  
       Sep 17, 2014
    唯一的办法是获取CPU或者主板的序列号进行屏蔽。
    azuginnen
        14
    azuginnen  
       Sep 17, 2014
    换浏览器不就是换 user-agent么,chrome版本号都可以到1000的。。。

    你让单位时间内发帖数不能超过一个阈值不就可以了,不但策略可以针对用户账号,也可以针对某一ip。

    比如v2ex单位时间内看帖数都不能高于一定的值,1分钟能看60个帖子,肯定是爬虫无疑。。
    old9
        15
    old9  
       Sep 17, 2014 via Android
    shiny
        16
    shiny  
    PRO
       Sep 17, 2014   ❤️ 1
    回复里很多帖子都不靠谱,大概不清楚 http 协议的原理。来自客户端的变量都不可信,除了 ip 地址没有多少信息可以信任的。
    raincious
        17
    raincious  
       Sep 17, 2014   ❤️ 2
    @kisshere 任何Client side的保护措置都是有破解可能的。

    你可以在服务器上绑定Cookie Session Key的产生策略:

    1. 仅当客户端有Cookie Session Key的时候允许用户登录。
    2. Cookie Session Key的产生机制与IP地址绑定。控制这个IP地址每分钟能够产生多少Cookie。当超过这个限制的时候禁止Cookie Session Key的产生,同时不使用任何Cookie Session Key。
    3. 对每个产生的Cookie进行两字段效验,存的时候类似于 SESSION_KEY|COOKIE_HASH,通过COOKIE_HASH来验证SESSION_KEY是否合法,加密算法可以自己设计个,比如用一个站点密钥什么的,和密码加密类似。
    4. 控制每个Cookie Session Key仅能绑定一个用户。

    这样发帖机必须得到Cookie才能发帖,并且由于上面的策略,他的发帖行为只能使用受到站点限制的Cookie Session Key来进行。当这个条件满足的时候:

    1. 设计用户发帖策略,限制用户每分钟的发帖数。
    2. 设置帖子内容提取策略,从帖子中提取一段或多段作为“特征码”。同样特征码+同一个用户发布的帖子不允许发布多次。
    3. 其实到这里你怎么玩都可以了,用户已经不可能通过刷新Cookie的方法随便变更保护Session Key了。
    zakokun
        18
    zakokun  
       Sep 17, 2014
    最简单的就是封ip了,他换ip比较繁琐,你封起来简单 还有就是提高发帖门槛,比如新注册账号必须做完一系列的新手任务,才允许发帖,等级低于一定的用户,一定时间内只能发1个帖子,这样的
    oott123
        19
    oott123  
       Sep 17, 2014 via Android
    换种思路吧
    比如给正常用户打 evercookie
    或者考虑这个思路 http://best33.com/96.moe
    chairuosen
        20
    chairuosen  
       Sep 17, 2014
    canvas指纹+1,但只能前端做
    surftheair
        21
    surftheair  
       Sep 17, 2014   ❤️ 1
    fingerprint https://panopticlick.eff.org/ 通过检测浏览器插件,字体,分辨率,显示器位深,时区等,几乎每台电脑(浏览器)都能生成唯一的fingerprint。一般论坛的小白被封了完全不知道怎么回事,再怎么删cookies换ip都没用。github上有个现成的库,我找不到了
    surftheair
        22
    surftheair  
       Sep 17, 2014
    @surftheair 给你一个我的测试地址http://jude.me/fingerprint/
    raincious
        23
    raincious  
       Sep 17, 2014
    楼上诸位真是太天真……

    实在看不下去了,先给 @shiny 点分,因为这回答才是正确的。

    各种浏览器“特征”检测实在太搞了。你们肯定没wget试一下,或者用curl写个程序提交个?其实换个IP也是分分钟的事,网上的代理服务器这么多,Tor也行。

    各位真的认为SPAMMER们会老老实实打开浏览器复制粘贴么?……

    另外 @oott123 的思路也挺靠谱,但是仍然太容易破,因为总是有数据要提交的,伪造一个不就完了。
    oott123
        24
    oott123  
       Sep 17, 2014 via Android
    @raincious 不是伪造不伪造的问题,是提高伪造的成本。

    > 对于 Spammer 来说,效率是摆在第一位的。他们需要用极短的时间来发送大量的 SPAM ,这就是 Spammer和普通的用户最显著的区别。

    利用这一点,我们可以使每位评论者都花上一点点的时间来计算一个特殊的 hash值,比如hash(time+i),然后循环使i自增,最后要求计算出来的 hash 满足一个特殊的条件如前3位相同,这样对于一个Spammer 来说,他发送一个 SPAM 所使用的资源提高了:需要更多的 CPU 和时间。而对于普通用户来说,浏览器计算这个 hash值的时间在 3 秒内,还不够用户输入一条完整的评论,对于用户来说几乎无影响。

    这一段
    oott123
        25
    oott123  
       Sep 17, 2014 via Android
    考虑你是一个 Spammer :你手上有大量的论坛需要你发 spam。
    其中大多数是直接可以发的。
    有的,可能有一些很容易破解的措施:比如验证码。
    还有的,非但反垃圾算法复杂,发一帖还得卡三秒…
    假如这个论坛不是你的重点对象,肯定放弃算了…
    em70
        26
    em70  
       Sep 17, 2014 via Android
    去广告要用机制解决,技术不行,参考v2ex你看怎么就没人发广告呢
    muzuiget
        27
    muzuiget  
       Sep 17, 2014
    同意 @shiny 和 @raincious

    无非就是几点

    1. 不要信任任何来自客户端的数据
    2. 提交发评论门槛
    3. 找出垃圾内容的相似模式,针对屏蔽。

    现在发垃圾广告谁还用浏览器,随便用 Java 写个请求性能蹭蹭就上去了。
    raincious
        28
    raincious  
       Sep 17, 2014
    @oott123

    嗯 ………………………………………………………………………………

    ^ 是的,我故意写了这么长的……,你应该注意到了嗯……,以上。

    但是你能比较一下你这个限制方式和在Session信息里加个保护周期有什么区别么?

    比如,限制当前Session的用户在3秒内只能提交一次?
    yylzcom
        29
    yylzcom  
       Sep 17, 2014
    调用akismet来清理
    目前我的论坛是设立一个板块,需要手输密码,输入密码才能访问这个板块发帖激活(就是一个积分增长的过程)
    这种办法对99.9%的发帖机有用,半个月有一两个手工注册的,这样的话就不足为虑了
    herold519
        30
    herold519  
       Sep 17, 2014
    修改评论机制;
    评论开启审核;
    或者弄段程序系统检测短时间内出现N多相似内容的文本直接冻结审核
    oott123
        31
    oott123  
       Sep 17, 2014 via Android
    @raincious session 里加的,我可以请求一个 session ,然后去别的论坛发帖,过1分钟再回来。
    算哈希,(这里简化一下,不考虑异步)你的 CPU 只有这么多,资源被我占用了,你这3秒就只能算我的哈希。
    shiny
        32
    shiny  
    PRO
       Sep 17, 2014
    @oott123 我身边的例子,是任劳任怨的大学生领着 2k 的月薪,手工发帖… 而且帖子不需要多,但是要有排名。
    oott123
        33
    oott123  
       Sep 17, 2014 via Android
    @shiny 手工发帖上面的都给出了各种奇葩办法,我解决的是机器发帖问题。
    mornlight
        34
    mornlight  
       Sep 17, 2014
    http请求你一般拿不到mac地址
    mornlight
        35
    mornlight  
       Sep 17, 2014
    @surftheair 感觉这个比较靠谱,机器发帖的话js不执行,不会生成这玩意。
    kisshere
        36
    kisshere  
    OP
       Sep 17, 2014
    @shiny 我的意思是,生成电脑的唯一id,即使他清除cookie也好,curl post时切换ip也好,这个id是不能变的,这样即使雇佣勤勤恳恳的大学生,也没办法,因为我已经ban掉你这台电脑了,你没权限发spam了,即使你人工输入captcha都不行
    kmvan
        37
    kmvan  
       Sep 17, 2014 via Android
    访客说不定全部信息都是假的。只能是验证码
    kisshere
        38
    kisshere  
    OP
       Sep 17, 2014
    @mornlight casperJs?
    raincious
        39
    raincious  
       Sep 17, 2014
    @kisshere 我能告诉你不可能实现么?因为这个比较准确嗯……

    哪怕是HTTP请求有一个“老大哥ID”字段,70亿人每人一个,但由于数据储存在计算机中(比如某个芯片里),且由于这是数据,那么这意味着都是可以变更的。

    参考IMEI。

    因此你只能通过周遭信息进行判定,这是一个系统工程,而不是一个函数就能搞定的。

    @oott123

    你这更加不靠谱了。

    1、我觉得这个方法走火入魔了。你的思路是“把这个人搞卡,让他卡到不能发帖”,这是不正确的。
    2、Hash运算或许可以被CPU多核加速,于是你无法稳定的提供3秒的计时。
    3、如果你设计一个不能被CPU多核加速的Hash算法,比如Blowfish之类的,那么这个算法必然仅仅限制在使用一个核心。别人用另一个核心去发就好了。
    4、3秒的Delay很短,但10秒+的Delay很常见吧?V2EX好像是120秒?你卡用户120秒用户肯定会不爽。
    lygmqkl
        40
    lygmqkl  
       Sep 17, 2014
    给你个思路:自动封ip,在文章中监测关键词,发现一次封ip30分钟,慢慢得测试代码,当出错率很低得时候,可以把时间提高到30hours,可以自动形成一个列表用于监测,足够了。
    mornlight
        41
    mornlight  
       Sep 17, 2014
    @raincious 你的考虑应该是对的,凡是http请求里带的东西都可以被伪造。感觉@kisshere 说的这个更适合于社区封禁特定的普通用户,反爬虫不行。
    mornlight
        42
    mornlight  
       Sep 17, 2014
    @lygmqkl 封ip应该是最不应该考虑的思路,稍微用点心的机器人都会带代理。有实时代理接口拿数据,发现自己被封了立马换。
    webjin
        43
    webjin  
       Sep 17, 2014
    这种不错
    oott123
        44
    oott123  
       Sep 17, 2014
    @raincious http://en.wikipedia.org/wiki/Hashcash

    我解释得不太清楚,还是参考维基的这个条目吧。

    当然这是一个最为另类的思路,同时也是影响较小、成本较低、效果较好的。

    总不能一次性把他们一网打尽了不是?
    raincious
        45
    raincious  
       Sep 17, 2014
    @oott123

    不,事实上Bitcoin是一种特殊的应用机制,他需要使用Hash来保证产生的货币数量。但是Session不是。

    另外:

    1、“影响较小”这我不知道怎么具体判定,跳过;
    2、“成本较低”这个应该不算,因为需要研究出算法。你只能先研究出算法然后才能知道成本具体是多少。但是我就所提到的的 if ($sessionPostLockExpire > time()) {} 这个的成本应该是恒定且不高的,哪怕加上那个Session系统(大部分网络系统都有这个,而其实你的方式也需要Session)。
    3、“效果较好”这个也不能判定,得看你算法的情况。你不能拿着个不存在的魔法算法来讨论这个问题。但是就普遍的情况而言,就像我39楼第2和第3条说的说,恐怕很难达到实用的程度。

    所以这么多未知面前,你得先把算法做出来,然后测试出结果才行。
    oott123
        46
    oott123  
       Sep 17, 2014 via Android
    @raincious 我做了呀
    我也在我博客和校bbs上实验过呀
    效果不错呀…
    pimin
        47
    pimin  
       Sep 17, 2014 via iPhone
    大概发广告现在都手动了?针对浏览器行为没有任何意义。相对来说单用户连续发两次广告概率比多用户发不同广告概率低太多了。所以不如整体考虑防广告策略。

    1.注册后发帖时间限制问题
    现在发广告的一般是脚本针对特定程序成堆注册配合人工注册N多账号备用,所以这个现在只能解决一小部分非专业广告者。

    2.特定逻辑
    针对新用户采取多种特定逻辑处理,完成才能发帖。比如:强制要求必须有头像,必须验证邮箱,必须填写个人资料里某特定项,前10贴有超级变态验证码等等。

    3.寻找群策群力的解决方案
    类似wp的广告插件,我想其它cms/bbs应该也会有,根本目的还是定义广告特征进行删贴。防患于未然。那些肉玲过别人的广告不能再蹂躏你,远远比那些蹂躏过你的广告不能再次蹂躏你意义大得多。
    bjzhush
        48
    bjzhush  
       Sep 17, 2014
    可以从多个不同的维度来防spam
    基于用户的,比如发送1次广告警告,2次删号
    基于ip的,有用户发广告时封这个ip一天/三天/七天/一万年
    同时可以基于cookie的,因为用户发表内容一般需要登录,不管是浏览器还是模拟登录都会带上cookie,具体策略你自己设计就好了
    crab
        49
    crab  
       Sep 17, 2014
    论坛的话,那应该有等级积分这类区分吧。设定新注册用户到某个等级之前,发贴前都需要回答自定义问题(别用验证码那种,那种可以代答。)
    imn1
        50
    imn1  
       Sep 17, 2014
    帐号和邮箱挂钩,只接受少数几个大公司的邮箱,封帐号就行了
    个人不可能有太多邮箱,如果他在那些大公司乱注邮箱,那些大公司也会拦截他的
    至于邮箱收不到验证码之类,那是客户问题,你这边用自己邮箱测试一下确认能发到就行
    Actrace
        51
    Actrace  
       Sep 17, 2014
    8楼的思路不错.
    bombless
        52
    bombless  
       Sep 17, 2014
    先加大非浏览器发送的难度(不过也有phantomJS这样的项目…)然后canvas指纹吧…
    thursday
        53
    thursday  
       Sep 17, 2014
    综合起来。。就一句话 技术解决是不可能的。只能和业务结合设计门槛。。 http协议摆在那里。客户端发来的东西 除了 ip 是真的(当然可以代理) 。其他都是由他发来的。就都可以伪造。 只有ip 因为数据包还要回去,所以不能是伪造的假ip。必须是发起者的ip。 所以只有ip是真的其他都是可以模拟的。而ip又可以代理。。。所以这个问题无解。。。只能结合业务设置门槛。。。除非天,tcp/ip 这套协议变了。估计还有戏。。。
    GhostFlying
        54
    GhostFlying  
       Sep 17, 2014
    @imn1 实际上经常看到spammer的邮箱是163或者qq的,对于大部分bbs来说,这种邮箱都是 不可能不允许注册的吧
    aaronlam
        55
    aaronlam  
       Sep 17, 2014
    验证码走起。。
    master
        56
    master  
       Sep 18, 2014
    @imn1
    我之前也试验过向邮箱发送注册连接并且完成二次激活与上传头像作为前提条件,但是实际效果也很不理想,能发现有大量的spamer在用Gmail和Hotmail来注册,有的是用.来重复利用帐号,有的就是一堆的帐号,头像这种能被机器模拟的就更是意义不大。
    同样,通过人工来完成注册到能发帖这第一道砍然后帐号放着备用,过了相当长一段时间发Spam的也很参见,也怀疑是某些专门注册帐号卖给Spamer的。

    我不知道为啥大家都那么喜欢封IP,我碰上的情况是封IP效果不好,还会引来正常用户的投诉。
    我这边之前检测到Spamer的特征是有相当部分IP来自福建。但是我网站访问群体也有30%左右在福建,所以有时稍微封一两个IP,没多久就能收到正常用户使用ADSL拨号出现无法访问的投诉,就让我基本放弃去封国内的IP。

    我现在的做法是首先注册的时候先限制IP注册频次,对IP、帐号和邮箱走akismet,其次在发帖操作的时候对用户帐号做一些评定,比如对于新帐号的注册地域、上次活跃地域和当前地域有非常大的差距时限制操作,比如新帐号的前几个帖子中有被触发认定为不合法帖子的比例达到阙值自动屏蔽帖子和封号等等
    konakona
        57
    konakona  
       Sep 18, 2014
    有以下常用手法:

    IP Or IP段(202.130.*.*)
    Member Account ID
    cookie Or cookie + session ID
    konakona
        58
    konakona  
       Sep 18, 2014
    @master 当你在运营一款线上产品(如bbs),如果不采取技术手段解决骚扰,就只能增加人工监管成本。
    konakona
        59
    konakona  
       Sep 18, 2014
    @thursday WEB所能作的一切,都是基于浏览器和HTTP协议的。
    因此并非不可能,而是这2个因素条件不允许。
    以后也不应该不会,因为不安全。

    —— 最多只能这样回答了-,,-
    如果楼主真的钻牛角尖,比如hacker 啊~~~~ 哈哈哈
    RemRain
        60
    RemRain  
       Sep 18, 2014 via iPhone
    这个问题贴近无解,但可以用各种技巧增加机器发帖成本,比如每个用户发帖提交的URL和参数不一样,页面元素弄的无规律,这样每个账号都需要分析请求。另外页面加载flash做运算,干掉phantomjs等模拟浏览器的工具。加入页面广告,并判断广告是否加载成功等,这样还能增加点收入
    RemRain
        61
    RemRain  
       Sep 18, 2014 via iPhone
    注册账号需要绑定手机号也是一个办法
    kisshere
        62
    kisshere  
    OP
       Sep 18, 2014
    @RemRain 怎样干掉phantomjs?
    RemRain
        63
    RemRain  
       Sep 18, 2014
    加载 flash 啊,phantomjs 默认是不加载 flash 的,即使重新编译 能加载 flash,也只是能显示,无法控制,无法模拟点击 flash 中按钮的
    imn1
        64
    imn1  
       Sep 18, 2014
    老实说,我是不太想教你方法,虽然我不做post(发广告),但做了10年get(爬虫)

    上面有些朋友说的对,几近无解、提高成本
    我遇到几个情况算是比较麻烦的,但并非我解决不了,只是懒得搞
    1.验证码,单纯的copy式验证码不难,难的是一些要思考的,就是答案并不在显示的图片内
    听闻清大还弄了个解高数的验证码?
    2.服务器端频率限制
    3.客户端(主要是js)用一个算法生成一个特征值(每次不同),服务器端反解判断

    1/2两种方法我觉得服务器那边算是山穷水尽了,因为这两种方法是严重影响用户体验的,是一种杀敌500自损1000的做法,很容易流失客户
    第三种可能只对我有效,其他人无效,因为我做爬虫不赚钱,纯兴趣,目标比较固定是图片和那些图片相关资料,个人对js引擎不太熟,图片到处都是,要我花时间去研究破那个js不值得;但那些发广告的都是有钱收的,性质就大不一样了,可能他们挂js引擎已经很熟悉了……

    我的建议是,摸索一下客户的忍耐程度,主要以方法2,不定时用方法1
    方法3如果做得很高级,也是有一定作用的,你可以从adblock -> anti adblock -> anti adblock killer 之间的战争往深处想

    最最高级的还是搞好站点的氛围,重疏轻堵,这方面我给v2ex点赞
    typcn
        65
    typcn  
       Sep 18, 2014   ❤️ 1
    成本最低的办法:让成熟的大厂商来做

    强制使用 openID 登陆 貌似现在 qq 号 已经很难批量注册了,因为要手机验证码。
    lygmqkl
        66
    lygmqkl  
       Sep 18, 2014
    @mornlight 你如果追求完美主义我只想说,没意义,你能做的就是用最低的成本,给他们造成最大的打击,上面谈的那一个点不能被伪造?莫非你还以为现在都是人工发的? 无非就是模拟出来一个包而已。 认真你就输了。
    lygmqkl
        67
    lygmqkl  
       Sep 18, 2014
    仔细读了上面各位的留言,很有智慧,我只想说,现在貌似需要一套算法来实现人工智能了。。。。太高大上了,开发成本考虑过吗
    tabris17
        68
    tabris17  
       Sep 18, 2014
    有种浏览器指纹识别,就是综合IP地址的地理位置、Cookie、Flash Cookie、User-Agent,还有通过JS获取到的一些客户端信息,比如:屏幕分辨率、是否支持Java、各种插件安装和版本信息等。

    各种因素综合得到浏览器指纹
    kisshere
        69
    kisshere  
    OP
       Sep 18, 2014
    @tabris17 能给个地址么?
    tabris17
        70
    tabris17  
       Sep 18, 2014
    @kisshere 我也没详细文章,要不你自己搜一下
    jedihy
        71
    jedihy  
       Sep 18, 2014 via iPhone
    任何程序都没办法取得对方mac地址,转发的时候mac会被替换,除非你们在同一个内网
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3606 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 04:49 · PVG 12:49 · LAX 21:49 · JFK 00:49
    ♥ Do have faith in what you're doing.