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

2022-03-29 14:40:37 +08:00
 rv54ntjwfm3ug8

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

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

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

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

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

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

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

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

不过就算 404, 其实通过时序攻击,也能测出来是不是真页面的
wenzhonghu
2022-03-29 15:24:07 +08:00
对于 GitHub 来说,404 就是 404 , 意味着该页面(库)事实上对你而言不存在。
Huelse
2022-03-29 15:33:42 +08:00
当你犹豫不决的时候,请按事实操作
wudaye
2022-03-29 19:42:08 +08:00
楼上说得都对
adoal
2022-03-29 21:25:36 +08:00
面对认真的攻击,全 403 并不会更安全。
pckillers
2022-03-30 15:49:40 +08:00
面对真正的攻击,不是给 302 跳转到特定内容的报错页然后给 200 状态码+随机内容的反馈+显示 404 的图片,更加能拖垮爬虫么?
julyclyde
2022-03-30 16:02:36 +08:00
gitlab 是给 404 的
用起来感觉很怪异

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843629

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX