有没有什么思路可以防止伪造请求 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whatisnew
V2EX    iOS

有没有什么思路可以防止伪造请求

  •  
  •   whatisnew 2015-04-17 15:32:02 +08:00 5704 次点击
    这是一个创建于 3899 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了防止伪造请求,想了各种办法,唉。。。
    像服务器端拿到 uuid 之后怎么验证这个 uuid 是正确的呢?
    比如有没有一个什么标准数据库可以检查 uuid 是正确的。

    或者有别的什么思路可以解决伪造请求的问题。。。像微信这种是怎么做的呢

    43 条回复    2015-04-18 15:16:06 +08:00
    whatisnew
        1
    whatisnew  
    OP
       2015-04-17 15:34:47 +08:00
    检查ip地址+token不现实
    检查 uuid 其实吧 uuid 也可以伪造

    真心头大
    whatisnew
        2
    whatisnew  
    OP
       2015-04-17 15:35:27 +08:00
    单独 token 更容易伪造
    whosesmile
        3
    whosesmile  
       2015-04-17 15:42:56 +08:00
    不太理解 单独 token更容易伪造是什么意思?

    常见的思路都是form表单提交的时候同时提交token, token生成的机制是这样:
    服务器端设置一个任意的字符串作为秘钥,简称为secretkey, 然后将用户的某个不可变信息+secretkey做md5或者sha加密,然后服务器接收到请求的时候,自己算一次,然后匹配这个token是否一致,如果你觉得依然不够安全,就将token在做一个时效性。

    前提是你的secretkey一定要足够安全。
    whatisnew
        4
    whatisnew  
    OP
       2015-04-17 15:54:27 +08:00
    @whosesmile 问题是客户端的任何信息都不可信

    其实可以这么理解:
    如何区别一个请求是由机器(工具或者什么软件之类的)发出的,还是正常的用户发出的。


    因为我发现机器伪造成正常用户太简单了,而我们好像没有什么好办法去鉴定这个。
    clino
        5
    clino  
       2015-04-17 16:00:25 +08:00
    "如何区别一个请求是由机器(工具或者什么软件之类的)发出的,还是正常的用户发出的。"
    这个应该是无法区分的吧...

    应该还是要从行为上来区分比较靠谱哈
    whatisnew
        6
    whatisnew  
    OP
       2015-04-17 16:02:04 +08:00
    @clino 腾讯这个鬼怎么做的,像微信这种。
    virusdefender
        7
    virusdefender  
       2015-04-17 16:06:28 +08:00
    过年的时候想过这个问题,只能无限的增大难度,基本无解。
    whatisnew
        8
    whatisnew  
    OP
       2015-04-17 16:07:07 +08:00
    @whosesmile 就算你通过了这一步验证,你返回回去的 token 认证信息,他拿到之后,再用机器请求这个 token 是一样的效果。。。比如 12306 通过他那个验证码之后,拿到 token 值,就可以任意买票了。
    virusdefender
        9
    virusdefender  
       2015-04-17 16:07:32 +08:00
    最主要原因客户端是可以被反编译和被抓包的。服务器和服务器之间的通信保证安全应该还是比较简单的。
    whatisnew
        10
    whatisnew  
    OP
       2015-04-17 16:09:26 +08:00
    @virusdefender 我和你一样,吃饭的时候都在想,最后采用了严格的注册机制比如绑定手机+身份证人肉认证+资源限制的方式,去解决的。
    whatisnew
        11
    whatisnew  
    OP
       2015-04-17 16:11:34 +08:00
    @virusdefender 是啊。其实我们现在采用的方式稍微安全一些,但是有些机器不停的扫用户密码,验证错误超过5次账号锁定了ip屏蔽了,有正常的用户就来找我们怎么登录不了了。。。我晕死
    whatisnew
        12
    whatisnew  
    OP
       2015-04-17 16:14:30 +08:00
    @clino 行为上的话,比如 ios 他打开应用肯定就是直接点登陆按钮啊。那么机器也是一样。。。
    如果他已经登录过了,那么就直接鉴权+获取资源了。问题是鉴权用的 key+token 被机器拿到一样可以获取资源。。。
    kemingcao
        13
    kemingcao  
       2015-04-17 16:25:49 +08:00
    以前也想过,此问题无解 ; )
    pi1ot
        14
    pi1ot  
       2015-04-17 16:31:57 +08:00
    提高伪造成本,降低伪造收益,HTTP层面杜绝是不可能的。
    whatisnew
        15
    whatisnew  
    OP
       2015-04-17 16:40:27 +08:00
    @pi1ot 所以我很好奇像微信、支付宝这种是怎么做的。。。
    clino
        16
    clino  
       2015-04-17 16:41:01 +08:00
    "验证错误超过5次账号锁定了ip屏蔽了"不锁定帐号屏蔽IP而是强制需要验证码? 这样会不会友好些
    或者对异常ip限制请求频率
    xenme
        17
    xenme  
       2015-04-17 16:44:39 +08:00
    两个人用一台电脑,公用一个账号密码,你怎么区分是一个人还是两个人?
    增加注册难度,比如绑手机,帮身份证啥
    增加单位时间的限制(一段时间内只能访问多少资源,人的话一般有个限度)
    变态点的,每次操作都搞一个验证码,机器不会烦死,人肯定烦死了。
    whatisnew
        18
    whatisnew  
    OP
       2015-04-17 16:44:40 +08:00
    @clino 这个本来就有验证码的。错误2次就会出现验证码。再错3次就锁定。24小时候后自动解锁。
    whatisnew
        19
    whatisnew  
    OP
       2015-04-17 16:46:39 +08:00
    我分析日志,各国的ip都有,各种ip,一部分还是连号的,不知道我们是不是被什么组织盯上了。
    ip 那么容易伪造吗?
    whosesmile
        20
    whosesmile  
       2015-04-17 16:49:42 +08:00
    @whatisnew 我明白你的意思了,但是不太懂你具体要做什么?类比微信、支付宝的某个业务,你可以举个例子么?
    whatisnew
        21
    whatisnew  
    OP
       2015-04-17 16:50:14 +08:00
    @xenme 像微信这种你怎么增加单位时间限制。。。只能从实名认证注册入手。
    然后,保护登录后的 token+key 也是很头疼的,他人肉注册一个抓包把 key+token 拿出来就可以了。
    whatisnew
        22
    whatisnew  
    OP
       2015-04-17 16:51:43 +08:00
    @whosesmile 比如在线金融-基金类的业务。当然实名,当然绑手机,但是这还不够。。。
    11
        23
    11  
       2015-04-17 16:54:01 +08:00
    @whatisnew HTTPS 怎么抓包?难道他们替换了 CA?
    whatisnew
        24
    whatisnew  
    OP
       2015-04-17 16:57:21 +08:00
    @11 问题不在 https 那些 token+key 你得存到本地吧。存本地另外再加密也不行。。。
    whosesmile
        25
    whosesmile  
       2015-04-17 16:58:31 +08:00
    @11 楼主的意思貌似是说不是中间人劫持,而是用户故意分析自己的数据,然后去伪造人工行为发送数据,举例就是通过浏览器插件来分析html代码之后,购买火车票的方法是没法避免的。
    whatisnew
        26
    whatisnew  
    OP
       2015-04-17 17:00:11 +08:00
    @11 从日志分析情况来看,我怀疑 https 也被破了,不知道他们是怎么做到的。现在只能是有异常的账号先锁定再人肉解决。
    whosesmile
        27
    whosesmile  
       2015-04-17 17:01:17 +08:00
    我自己感觉也是无解,这就是游戏外挂,所有数据都合法,能想到的也是通过用户行为分析了。
    whatisnew
        28
    whatisnew  
    OP
       2015-04-17 17:02:03 +08:00
    @whosesmile 两种情况都是避免
    11
        29
    11  
       2015-04-17 17:05:27 +08:00
    @whosesmile 了解了。。自己理解错了。。
    whatisnew
        30
    whatisnew  
    OP
       2015-04-17 17:05:49 +08:00
    特别是 android 机,java 太烂了!反编译也太容易了。。。
    whosesmile
        31
    whosesmile  
       2015-04-17 17:06:46 +08:00
    @whatisnew 微信获取access_token的时效性是2小时,他要求服务器端做分发机缓存这个token,如果不做缓存,每次都访问微信服务器,它是有次数限制的,会拒绝访问的。从这个角度出发,其实你也可以评估一个合理的上限,然后拒绝服务,不过毕竟微信只提供认证,它没有具体业务,因此比较容易,至于其他的新版的SDK也都有上限限制的。
    justfly
        32
    justfly  
       2015-04-17 17:10:10 +08:00
    如果你有客户端的话 使用rsa 客户端保存私钥 保证不泄漏 根据整个请求做签名 时间戳参与签名 服务端用公钥校验签名 同时对完全相同的签名拒绝访问 使用https 防止中间人
    whatisnew
        33
    whatisnew  
    OP
       2015-04-17 17:13:27 +08:00
    @justfly 客户端任何信息都不可信。 rsa 同样也要保存在客户端。同时认证太慢。不如 key+token
    knightlhs
        34
    knightlhs  
       2015-04-17 17:32:51 +08:00
    你这个不是解决的思路
    如果客户端可以信任 那就加密通信数据
    如果客户端不可疑信任那……他怎么样都能拿到一个 token 实在不行我注册一个真用户总可以了吧
    其次 你需要判断用户的行为 1秒钟看了10次列表肯定不正常 没完没了的刷列表也不正常
    你可以给一个行为特征判断 一旦满足 就封禁一段时间 靠数据加密是不可能的
    cdffh
        35
    cdffh  
       2015-04-17 18:14:15 +08:00   1
    http协议本来就是无状态的。所以你让http做这个事情太难了。建议你开一个websocket 定时服务器端下发随机的密钥,然后前端使用密钥来做一些请求。可以一定程度上防止。
    pi1ot
        36
    pi1ot  
       2015-04-17 18:57:03 +08:00
    @whatisnew 支付是有身份信息的。
    RIcter
        37
    div class="sep3"> RIcter  
       2015-04-17 19:38:26 +08:00 via iPhone
    法防真心的qwq
    mucid
        38
    mucid  
       2015-04-17 22:31:04 +08:00
    @whosesmile 没啥用,你比如tornado,只要取出cookie的xrsf照样可以伪造……
    fredcc
        39
    fredcc  
       2015-04-17 23:25:01 +08:00
    2个部分吧
    1、验证客户端的合法性(比如说google的二步验证、短信验证码等等
    2、保证合法客户端的会话安全(这里https啊、证书验证啊之类之类咯
    kukat
        40
    kukat  
       2015-04-18 00:11:31 +08:00   1
    服务端和客户端都保存一份token,客户端一定不要明文保存最好混淆一下。
    对每次请求签名 signature = md5(URL_PATH+QueryString+Timestamp+token)
    请求参数里加上timestamp=xxx&signature=yyy
    服务端收到请求检查 timestamp 是否在有效期内
    计算签名 signature = md5(URL_PATH+QueryString+Timestamp+token)
    判断签名是否匹配

    基本能防住包括 repeat attack 在内的恶意请求了
    Ghoul2005
        41
    Ghoul2005  
       2015-04-18 02:09:04 +08:00   1
    深层次的话要分析对方的动机和成本,别人为什么要刷你,刷你有什么好处,能否提高对方刷你的成本,当成本高到一定程度时就不值得去刷你了。

    直接的话就是验证码,严谨地说是CAPTCHA,验证码只是实现形式之一。
    clino
        42
    clino  
       2015-04-18 08:09:06 +08:00
    @whatisnew "这个本来就有验证码的。错误2次就会出现验证码。再错3次就锁定。24小时候后自动解锁。"
    这个只要做到对ip限制尝试次数是不是会更好些,因为真正的用户和攻击者用同一个ip的机会会比较小
    而且你的限制太严,3次太少了
    比如1天给一个ip 15次帐号出错的机会
    ZavierXu
        43
    ZavierXu  
       2015-04-18 15:16:06 +08:00
    https双向证书验证+不要用安卓....
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:46 PVG 17:46 LAX 01:46 JFK 04:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86