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

既有可能无权限也有可能真的不存在的页面返回 403 还是 404 好?

  •  
  •   rv54ntjwfm3ug8 · 2022-03-29 14:40:37 +08:00 · 1851 次点击
    这是一个创建于 756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不想让用户知道正在访问的页面是真的不存在还是没有权限访问。我觉得 403 更合适,但貌似更多网站用 404 ,例如 GitHub 未登录访问私有库返回的就是 404 。这有什么好处?

    16 条回复    2022-03-30 16:02:36 +08:00
    golangLover
        1
    golangLover  
       2022-03-29 14:43:53 +08:00 via Android
    因为你告诉别人 403 就是告诉别人这其实有路由,只是不让你进来,黑客可能透过具路由猜你其他存在的路径
    chendy
        2
    chendy  
       2022-03-29 14:47:55 +08:00
    404 直接不告诉用户这个东西存在
    403 用来表示没有权限,可能暗示“可以去申请权限”,类似 401 可以“引导用户去登陆”一样
    rv54ntjwfm3ug8
        3
    rv54ntjwfm3ug8  
    OP
       2022-03-29 14:51:42 +08:00
    @golangLover #1 我的意思是一个路由下的页面不管是否存在,只要没权限全部返回 403
    learningman
        4
    learningman  
       2022-03-29 14:54:09 +08:00
    403 可以通过遍历来进行路径猜测,如果统一 403 那就违反了 http code 的语义
    lolizeppelin
        5
    lolizeppelin  
       2022-03-29 14:58:25 +08:00
    我觉得业务层面按标准来最好

    至于安全防护..给外面的设备或者 nginx 层来过滤处理
    由外部将 403 转 404
    yuzo555
        6
    yuzo555  
       2022-03-29 15:00:53 +08:00
    403 啊,就算存在你也没权限啊。。
    wenzhonghu
        7
    wenzhonghu  
       2022-03-29 15:14:55 +08:00
    这里不是一样吗?

    本质上就是无论情况 A 还是情况 B ,统一返回 C (或 D)。只要保持 C 或 D ,那别人自然无法推测出到底是情况 A 还是情况 B ,和你的返回值无关。
    wjx0912
        8
    wjx0912  
       2022-03-29 15:17:39 +08:00
    既有可能无权限也有可能真的不存在,意思是有可能存在,403 吧
    wenzhonghu
        9
    wenzhonghu  
       2022-03-29 15:22:07 +08:00
    从具体语义来说,应该说 GitHub 做的更好。

    对不存在的页面返回 403 显然是误导的(当然除非你故意误导),这会导致有权限的用户不小心了输错了 URL 后,误以为自己的权限不够。

    对于 GitHub 来说,如果你直接的获得了一个 repo 的 URL 并且进行访问,那么就默认了这是一个公开 repo 。

    如果你这个库是私有的(并且没有共享给你),那么对于你来说就是不存在,而不是权限不够。因为通常意义上,对于私有库的只读访问是不存在权限概念的。取而代之的是共享的概念。所以在这种情况下,返回 404 是符合语义的。
    westoy
        10
    westoy  
       2022-03-29 15:23:34 +08:00
    403 不是本地无银三百两么

    真想隐藏 404 啊, 而且还得保证和静态文件返回的是一样, 也不要输出含一些框架标识的特殊 http 头

    不过就算 404, 其实通过时序攻击,也能测出来是不是真页面的
    wenzhonghu
        11
    wenzhonghu  
       2022-03-29 15:24:07 +08:00   ❤️ 1
    对于 GitHub 来说,404 就是 404 , 意味着该页面(库)事实上对你而言不存在。
    Huelse
        12
    Huelse  
       2022-03-29 15:33:42 +08:00
    当你犹豫不决的时候,请按事实操作
    wudaye
        13
    wudaye  
       2022-03-29 19:42:08 +08:00
    楼上说得都对
    adoal
        14
    adoal  
       2022-03-29 21:25:36 +08:00
    面对认真的攻击,全 403 并不会更安全。
    pckillers
        15
    pckillers  
       2022-03-30 15:49:40 +08:00
    面对真正的攻击,不是给 302 跳转到特定内容的报错页然后给 200 状态码+随机内容的反馈+显示 404 的图片,更加能拖垮爬虫么?
    julyclyde
        16
    julyclyde  
       2022-03-30 16:02:36 +08:00
    gitlab 是给 404 的
    用起来感觉很怪异
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3806 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 04:16 · PVG 12:16 · LAX 21:16 · JFK 00:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.