跨站点伪造请求
跨站点伪造请求是指攻击者引诱用户点击恶意链接,然后将用户转到已完成身份验证的站点。由于用户已在该站点完成身份验证,恶意链接中嵌入的任何命令都可能会自动运行,所以用户不会看到登录界面或者任何其他恶意活动迹象。在使用亚马逊帐户登录的情况下,跨站点伪造请求可用来模拟客户端或身份验证服务器。
Login with Amazon建议使用state
参数来阻止跨站点伪造请求。客户端应在发起授权请求时设置好state
参数值,并将其保存到用户的安全会话中。与client_id
和client_secret
值不同,state
参数应为每个授权请求赋予唯一且不可猜测的值,以便在防范攻击时发挥作用。授权服务器与客户端通信时将返回相同的state
,以提供授权码和。访问令牌。为防止用户免于攻击,如果返回的state
参数值与初始调用不匹配,客户端必须忽略通信。
计算状态参数
客户端可以选取任何方式来计算state
参数值,不过应保护参数值免于伪造。Login with Amazon建议使用安全生成的随机字符串,所含熵值不应少于256位。要使用此方法计算state
值,请在加密操作中使用合适的随机数生成器。
以下为Python示例:
def generate_state_parameter():
random = os.urandom(256)
state = base64.b64encode(random)
return (state)
state
参数值生成后,将其保存到用户会话信息,以确保信息安全通信并已保存到安全会话。授权响应返回state
后,将其与保存到用户会话的state
值进行比较,以验证用户合法性。如果两个值不匹配,应忽略授权响应。
如果您还使用state
参数值来动态重定向已完成身份验证的用户,请考虑将安全生成的随机字符串与动态URL连接起来,并以空格分隔(例如state = state + " " + dynamicURL
)。授权服务器返回状态后,将对其进行解析,并根据空格将其拆分为两个值。第二个值包含的动态URL将把完成身份验证后的用户转到相应页面。