关于OAuth安全的几个重要事实
- OAuth without SSL is a Bad Idea™ 并且强烈建议您使用
用于与您的API的所有交互以及用于设置令牌的SSL。一个特别糟糕的例子是,当发送带有表单数据的POST请求时,OAuth签名中没有考虑到这些数据,成功的中间人攻击者可以将表单数据(或文件)交换到他喜欢的任何位置,而不会使签名无效。如果您无法检查每个请求的随机数/时间戳对,这将是一个更大的问题,从而允许拦截您的请求的攻击者稍后重播它,从而覆盖您的初始请求。 Server defaults to fail all requests which are not made over HTTPS ,您可以使用Enforce_ssl属性显式禁用此功能。
- Tokens must be random ,OAuthLib提供了一种生成
安全令牌,它被打包成
oauthlib.common.generate_token
,使用它。如果您决定滚动您自己的,请使用secrets.SystemRandom
适用于Python3.8及更高版本。这个secrets
模块设计用于生成加密强随机数。对于早期版本的Python,请使用random.SystemRandom
它的基础是os.urandom
而不是默认设置random
基于高效但不是真正随机的Mersenne Twister。可预测令牌允许攻击者绕过OAuth提供的几乎所有防御。
- Timing attacks are real 如果您主持您的
共享数据中心内的应用程序。确保所有
validate_
无论给出哪种输入,方法都会在几乎恒定的时间内执行。这一点将在后面详细介绍。不对定时攻击进行解释可能 enable attackers to enumerate tokens and successfully guess HMAC secrets 。请注意,RSA密钥通过RSA盲化进行保护,不会有风险。
- Nonce and timestamps must be checked ,不要忽视这一点,因为这是一种
简单有效的防止重放攻击的方法。如果做不到这一点,就会在网上残酷地强加秘密,而这不是你想要的。
- Whitelisting is your friend 并有效地消除了SQL注入
以及其他对您宝贵数据的恶意攻击。有关这方面的更多详细信息,请参阅
check_
方法:研究方法。
- Require all callback URIs to be registered before use 。OAuth提供程序
处于能够限制可以提交哪些URI的独特位置,从而使验证简单而安全。此注册应在您的应用程序管理界面中完成。