Security 我应该使用403、404或444来阻止nginx级别的API端点吗

Security 我应该使用403、404或444来阻止nginx级别的API端点吗,security,nginx,Security,Nginx,我想在nginx级别阻止一些API端点。我用 server { listen 443; ssl on; ssl_certificate /app/cert.pem; ssl_certificate_key /app/key.pem; location = /this_api_path_should_be_blocked { return 444; } location / { proxy_pass ht

我想在nginx级别阻止一些API端点。我用

server {
    listen 443;
    ssl on;

    ssl_certificate /app/cert.pem;
    ssl_certificate_key /app/key.pem;

    location = /this_api_path_should_be_blocked {
        return 444;
    }

    location / {
        proxy_pass http://localhost:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
我想知道,对于安全性最佳实践,要返回的正确错误代码是什么。应该是吗

  • 403禁止错误
  • 404未找到错误
  • 444连接已关闭,无响应

我建议使用与API行为最匹配的状态代码,最后返回的代码/消息是为了更好地了解发生了什么,不会影响API本身的安全性

在您的示例中,如果路径被阻止,您可能可以通过使用添加一些允许/拒绝策略,默认情况下,这将返回
403禁止的

如果要返回自定义
444
,可以执行以下操作:

location = /this_api_path_should_be_blocked {
    allow 10.0.0.0/16;
    deny all;
    error_page 403 =444 /444.html;
}

如果是需要某种授权的路径,那么在本例中,您可以坚持使用状态代码
403禁止
,即使是一些API返回404,例如Github,也有意义,无论哪个操作合适

如果您试图阻止未经授权的调用
/this\u api\u path\u应该被阻止
,那么您应该返回403:probled,因为这会通知用户该路径存在,并且不允许他们访问该路径。他们应该登录吗?他们是否应该随身携带令牌以证明自己是授权用户


如果用户对根本不存在的路径进行调用,则应返回404:notfound响应。这应该是对所有未定义调用的默认响应。

我认为状态代码根本不会影响安全性。这取决于您返回的代码-按照您认为合理的方式进行设计,然后在文档中进行描述:)如果您因为请求未经授权(即登录失败)而阻止访问,那么401 Unauthorized应该是您的初始响应,并随附WWW Authenticate标头以解释如何进行身份验证。如果用户已正确验证,但没有访问资源的权限,则其403禁止。我不确定您是否混淆了授权和验证。但在本例中,之所以提供403,是因为用户没有经过身份验证(他们缺少API密钥或其他东西)。如果用户已通过身份验证,但未被授权访问该资源,则应向其提供401。此示例不考虑经过身份验证但未经授权的用户。希望这能澄清问题,因为“未经授权”这个词是个错误的选择。如果你严格遵守标准,那么401是两种情况下的正确答案。401响应必须包括包含身份验证质询的WWW Authenticate标头。事实上,该标准让那些收到401,然后进行身份验证但未经授权,然后又收到另一个401的用户感到困惑,因此许多服务器为经过身份验证但未经授权的用户提供403服务。看到和