java - 当页面不存在时,未在未经授权的 URL 上找到页面 404

标签 java spring spring-mvc spring-security http-status-code-404

我对 Spring Security 进行了以下设置,默认拒绝所有(请参见下面的示例)。我不想更改默认拒绝所有,因为它是安全配置的防御方式,并且也被认为是良好的做法。显然,如果用户想要访问某个不存在的页面,他会得到 403,因为默认拒绝所有策略。当页面不存在时,我想要结果 404;当用户访问权限受到限制时,我想要结果 403。有没有办法为这种行为配置 Spring Security?

示例:

    <intercept-url pattern="/posts/remove" access="hasRole('ADMIN')" />
    <intercept-url pattern="/posts/add" access="hasRole('EDITOR')" />
    <intercept-url pattern="/posts" access="permitAll" />
    <intercept-url pattern="/" access="permitAll" />

    <!-- Default is access denied -->
    <intercept-url pattern="/**" access="denyAll" />
</http>

当用户请求 /something-that-not-exists 时,他应该得到 404(而不是 403)。当 EDITOR 用户请求 /posts/remove 时,他应该得到 403。

最佳答案

我认为您所做的假设之一是不正确的。你说:

When user requests /something-that-not-exists he should get 404 (Not 403)

这与以下内容直接冲突:

<intercept-url pattern="/**" access="denyAll" />

因为/something-that-not-exists是 protected 资源无论它是否存在。作为未经身份验证的用户,您不应该提出“/something-that-not-exists 是否包含有效资源?”的问题。这样做违反了安全模型。想象一下这些假设的网址:

假设这个网址存在:

/admin/accounts/email/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="771a1e1b120437120f161a071b125914181a" rel="noreferrer noopener nofollow">[email protected]</a>

经过身份验证的用户应收到 200 OK 响应。未经身份验证的用户应被重定向到登录页面。

假设现在这个网址存在:

/admin/accounts/email/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="63000c0f1711020d0623061b020e130f064d000c0e" rel="noreferrer noopener nofollow">[email protected]</a> 

经过身份验证的用户应该收到 404 NOT FOUND 响应。未经身份验证的用户应被重定向到登录页面。

如果我们向未经身份验证的用户返回 404,我们就会暴露一个安全漏洞,攻击者可以通过电子邮件地址查询系统中是否存在用户。

因此,您需要重新考虑上述假设或 denyAll 规则,因为它们是互斥的。

关于java - 当页面不存在时,未在未经授权的 URL 上找到页面 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379186/

相关文章:

java - javafx中的新手切换按钮事件

java - Spring 单例范围

java - 使用 POST 方法的 Spring 和 ExtJS “Bad Request”

java - 线程 "main"中的异常 org.springframework.jdbc.CannotGetJdbcConnectionException

java - 使用java向WhatsApp发送消息

java - 来自 Java 源代码的 Uml 工具

java - 如何使用 java 中的日期 API 验证年份

java - Spring 3.1 : DataSource not autowired to @Configuration class

java - 使用 Spring Security 进行 Spring Boot 测试。如何启动另一种安全配置?

java - 使用Web预览服务器在eclipse中运行Maven Spring项目