V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qshu
V2EX  ›  程序员

奇葩的后端分页要求 --后端大佬安排&前端小白实现

  •  
  •   qshu · 2019-05-25 16:41:47 +08:00 · 4845 次点击
    这是一个创建于 2011 天前的主题,其中的信息可能已经有所发展或是发生改变。

    GET 参数 params 来获取指定页内容

    /api/cont?limit=数量&continue=Base64 加密的 JSON 页数

    大家有没有遇到过这样搞分页的,页码数 base64 加密?

    41 条回复    2019-05-26 18:26:08 +08:00
    viakiba
        1
    viakiba  
       2019-05-25 16:44:06 +08:00 via Android
    base64 只能称为编解码 不属于加密
    FrankFang128
        2
    FrankFang128  
       2019-05-25 16:44:46 +08:00
    这不算奇葩,只能算脱裤子放屁——多此一举。
    qshu
        3
    qshu  
    OP
       2019-05-25 16:45:47 +08:00
    @viakiba 编码人类不能直接理解与加密有什么区别(-_-)
    imnpc
        4
    imnpc  
       2019-05-25 16:46:27 +08:00
    页数 base64 ?我记得 get 传递 base64 会出问题来着?有些符号会变?
    yahon
        5
    yahon  
       2019-05-25 16:46:44 +08:00   ❤️ 1
    可以,但没必要。
    qshu
        6
    qshu  
    OP
       2019-05-25 16:48:06 +08:00
    @imnpc 大佬是这么要求的 出问题接着问他就把类似 "{"start":2}"这种字符串转 base64
    zjsxwc
        7
    zjsxwc  
       2019-05-25 16:49:16 +08:00
    如果 base64 后包含符号 & ? + 等符号时,
    你不就凉了 233333
    LancerComet
        8
    LancerComet  
       2019-05-25 16:49:33 +08:00
    如果是 JSON 的问题,可以 stringify 之后当字符串传,这种还挺多的
    Elethom
        9
    Elethom  
       2019-05-25 16:50:58 +08:00
    这种后端留着过年?怕不是来搞笑的吧。
    qshu
        10
    qshu  
    OP
       2019-05-25 16:51:50 +08:00
    @zjsxwc 好像是唉,把这放在 URL 真的无语
    tomczhen
        11
    tomczhen  
       2019-05-25 17:03:49 +08:00   ❤️ 6
    为了防止遍历分页还是有把分页编码或者加密的需求的。

    base64 中只有 / 和 + 字符,没有 & 和 ?,而且 web 上一般用 url safe base64,所以担心特殊字符的就算了。
    passerbytiny
        12
    passerbytiny  
       2019-05-25 17:08:13 +08:00
    难道是反爬?
    gaoryrt
        13
    gaoryrt  
       2019-05-25 17:08:36 +08:00
    @zjsxwc base64 编码之后合法字符包括 [A-Za-z/+=]
    讲道理应该是没问题的。。。吧
    qshu
        14
    qshu  
    OP
       2019-05-25 17:09:28 +08:00
    @passerbytiny 反爬好像是有那么点效果的
    qshu
        15
    qshu  
    OP
       2019-05-25 17:10:59 +08:00
    @tomczhen
    @gaoryrt 感谢,刚查了下,是没有影响的字符,才疏学浅了
    zjsxwc
        16
    zjsxwc  
       2019-05-25 17:12:51 +08:00
    @gaoryrt

    看了下普通数字是不会有特殊字符 0-9 总共就那么几个字母轮流替换
    Macolor21
        17
    Macolor21  
       2019-05-25 18:11:16 +08:00 via iPhone   ❤️ 4
    @qshu
    编码就是编码,加密就是加密,不能混淆。那我们的编程语言的也对普通人不可理解,那算加密么?
    另外这种风格我见国外的外部 api 也有用的,一般就是出于各种考虑和妥协的后果,不要见到什么不和自己的理念就吐槽,这种心态不太好。
    hanxiV2EX
        18
    hanxiV2EX  
       2019-05-25 18:25:12 +08:00 via Android
    加密 url 参数也不是这样搞的呀,接过 sdk 的都应该知道是给参数加盐后求 sign
    fundon
        19
    fundon  
       2019-05-25 18:31:51 +08:00
    还不如 POST 数据一把梭
    vevlins
        20
    vevlins  
       2019-05-25 18:37:34 +08:00
    反爬也不能用这种手段啊,太不优美。大佬都给你安排好了你还准备跟他肛一波不成?按照要求写呗
    Vegetable
        21
    Vegetable  
       2019-05-25 20:06:48 +08:00
    自以为是吧,不过 base64+urlencode 看起来的确不那么容易直接看出来,但是 f12 看一下,大家都会把 base64 过的字段解出来看一下的。所以这一步只是自己骗自己。
    MonoLogueChi
        22
    MonoLogueChi  
       2019-05-25 20:16:42 +08:00 via Android
    base64 没问题啊,jwt 就是 base64 编码的,有那么多人在用,为什么楼上说凉凉之类的。这样用也没什么问题吧,只要能解决需求就好,在 get 参数里做 base64 编码也是很常见的操作
    code2019
        23
    code2019  
       2019-05-25 20:20:12 +08:00
    不应该是 POST 嘛
    Lax
        24
    Lax  
       2019-05-25 20:50:36 +08:00
    如果目的是反爬的话,单单把参数放 json 里在 base64 这一种措施真的是没什么用,大佬的方案里是不是还有其它关键参数?
    winglight2016
        25
    winglight2016  
       2019-05-25 21:42:50 +08:00
    @code2019 post 没法缓存,不适合列表页面
    kekxv
        26
    kekxv  
       2019-05-25 22:07:34 +08:00 via Android
    也许是祖传的坑,一直没改
    xiangyuecn
        27
    xiangyuecn  
       2019-05-25 22:33:09 +08:00
    @viakiba base64 编码也算是一种加密!不信来一段试试:

    5oiR5LiN5L+h5L2g6IO95LiA55y855yL5Ye65oiR5Yqg5a+G55qE5q2k5q615YaF5a65

    在不知道解密算法的前提下,要得到明文是很困难的,哈哈😉

    ----------------


    此后端分页要求在合理的场景下不算奇葩。也许是增加别有用心的人的利用难度而已,算是低成本高回报;加密算法也许哪天可以不用 base64 了,换成别的,或者算法一天一换。

    另一个心里安慰:用户看不到 url 里面的页码。。。看起来蛮高大上😂
    yhxx
        28
    yhxx  
       2019-05-25 22:41:21 +08:00
    类似 "{"start":2}"这种字符串也转 base64

    不会因为 url 长度太长出现某些奇怪的问题吗?
    zsdroid
        29
    zsdroid  
       2019-05-25 22:48:53 +08:00
    md5 可还行
    an168bang521
        30
    an168bang521  
       2019-05-25 22:52:43 +08:00
    感觉这么做可以的,类似网页防用户复制和前端压缩混淆一样,防住一些初级小白和君子就好;
    业务上没问题,增加爬取难度就行了,
    真想爬你的页面,你再怎么加盐,加 sige,别人大不了直接绕过你那一套,直接拿你页面"下一页"的最终链接,还不是直接爬到;
    luopengfei14
        31
    luopengfei14  
       2019-05-25 23:19:26 +08:00 via iPhone
    @zsdroid md5 不可逆,只能做校验吧 눈_눈
    mooncakejs
        32
    mooncakejs  
       2019-05-25 23:23:21 +08:00
    关键在于 continue 的内容是前端 encode 的还是后端直接字符串返回的,如果是后者,这就是一个 cursor,前端不应该关心其内容。
    chendy
        33
    chendy  
       2019-05-25 23:25:43 +08:00
    脱裤子放屁行为
    还反爬虫…随便开几个观察一下参数就知道怎么回事了好么…
    qshu
        34
    qshu  
    OP
       2019-05-26 13:34:30 +08:00
    @mooncakejs 作为分页的按钮来跳转,每次都需要 encode,跳转的话,翻下一页的话,还是需要自己转
    qshu
        35
    qshu  
    OP
       2019-05-26 13:38:31 +08:00
    @vevlins 有疑问,感觉这么做不大合适,才发出来看看大家意见和建议
    Youen
        36
    Youen  
       2019-05-26 14:22:30 +08:00
    和 OData 差不多啊。 编码一下也没啥, 反向代理会过滤一些带特殊字符的 URL
    yanguangs
        37
    yanguangs  
       2019-05-26 15:48:23 +08:00
    base64 可不是加密啊
    我们的解决方式是 post 方式传 json,
    因为之前的项目使用的 mogodb,所以参数是 skip limit,还是很奇怪
    qshu
        38
    qshu  
    OP
       2019-05-26 16:00:00 +08:00
    @xiangyuecn 同理解
    Jiangyf
        39
    Jiangyf  
       2019-05-26 16:12:32 +08:00
    这边建议加盐再 Base64 处理传给后端呢
    pinews
        40
    pinews  
       2019-05-26 17:33:05 +08:00
    php:

    function urlsafe_base64_encode ($data) {
    return str_replace(array('+','/','='),array('-','_',''), base64_encode($data));
    }
    bwangel
        41
    bwangel  
       2019-05-26 18:26:08 +08:00
    base64 中就三个特殊点的字符,+ / =

    可以搜索 URL Safe Base64,会将 + / 替换成 - _,同时不再尾部添加=表示补充的字节。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:01 · PVG 19:01 · LAX 03:01 · JFK 06:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.