首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS Chalice意外行为

AWS Chalice意外行为
EN

Stack Overflow用户
提问于 2016-08-30 05:29:31
回答 1查看 840关注 0票数 0

我正在编写一个Chalice部署,并且体验了我无法解释的行为。

我的根端点接受PUT请求,并验证一些基本的授权凭证。

代码语言:javascript
复制
from chalice import Chalice
from base64 import b64decode

app = Chalice(app_name='test-basic-auth-issue')

@app.route('/', methods=['PUT'])
def index():
    auth = app.current_request.headers['Authorization'].split()

    username, password = b64decode(auth[1]).split(':')

    if username == 'test-user' and password == 'test-password':
        return {username: password}

    else:
        raise Exception('Unauthorized')

使用curl与此API进行接口:

代码语言:javascript
复制
curl https://test-user:test-password@<API-URL>/dev/ --upload-file test.txt

我得到以下答复:

代码语言:javascript
复制
{"message":"Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=Basic dGVzdC11c2VyOnRlc3QtcGFzc3dvcmQ="}

但是-当在URL中包含任何参数时:

代码语言:javascript
复制
curl https://test-user:test-password@<API-URL>/dev/?ANYTHING --upload-file test.txt

我得到了以下预期的回应:

代码语言:javascript
复制
{"test-user": "test-password"}

我不知道为什么指定参数会影响授权。

EN

回答 1

Stack Overflow用户

发布于 2016-08-30 22:46:09

我没有内部信息,所以我无法知道以下内容是否真的正确,但这似乎是对你所看到的行为的合理解释。

AWS通常支持两种提供凭据的替代方法: header.

对于检查Authorization:头的堆栈中的层,您的值似乎是错误的,因此它们会抛出一个错误,因为您提供的凭据格式不正确.

...unless它在URI中看到一个查询字符串..。在这种情况下,它可以选择允许请求继续进行,前提是授权可以在该层进行。

因此,请求被传递到另一个层,该层负责查询字符串处理。它不会在查询字符串中找到任何凭据,但它也知道在以前处理标头时没有找到凭据,因此如果允许的话,请求将作为匿名请求处理。

因此,您正在滑过一个洞:通过添加查询字符串、任意查询字符串,可以防止Authorization:标头抛出错误。

据我估计,这不是一个安全漏洞,而是URI中的某些内容改变了头的解释方式的情况--特别是,一个格式错误的(就其目的而言)授权标头是否会触发异常或允许通过。

我认为有一个合理的理由将这种行为称为“破坏”,但同时我怀疑它可能不在API Gateway开发人员的手中,他们正在开发一个未命名的前端组件,这是多个AWS服务所共有的。API是AWS生态系统中的一个例外,因为客户可以定义如何操作头.因此,这很可能只是一个平台限制。

我不同意@LorenzodeLara关于API网关不符合RFC-7235的说法--在一定程度上和技术上不同。没有要求服务器使用WWW-Authenticate: (来自RFC)进行响应:

在接收到对被保护资源的请求时,该资源省略凭据,包含无效凭据(例如,错误密码)或部分凭据(例如,当认证方案需要多个往返时),源服务器SHOULD发送包含WWW的401(未经授权)响应,该响应包含WWW-使用至少一个(可能是新的)可应用于所请求资源的挑战来验证头字段。

RFCs中的单词SHOULDRECOMMENDED表示可能存在有效异常的期望行为。它们不是强制性的要求。

另一方面,API网关完全不支持从其角度使用HTTP basic auth对请求进行身份验证,这是完全准确的。但是,您只是试图让它将这些凭据传递到运行在内部的代码,这看起来确实有效,因为您的用户代理提交凭据而不存在任何挑战.假设您通过添加查询字符串来防止前端系统阻碍您的工作。

这是我的分析,如果有人能够获得更权威的信息,就可以加以纠正。从这个角度看,使用基本的方法可能不是最好的计划,因为它似乎是偶然的。

我不想得出这个结论。Basic的说唱很糟糕,与HTTPS相结合并不是完全值得的--与请求签名不同,它通常“只是有效”,甚至对于一个不理解GETPOST之间区别的用户来说也是如此,更不用说如何生成一个十六进制编码的HMAC摘要了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39219356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档