云服务器网:购买云服务器和VPS必上的网站!

Python中的CSRF攻击与OAuth认证

CSRF攻击CSRF(Cross-Site Request Forgery,跨站要求捏造)是一种常见的Web利用程序安全漏洞,攻击者可以利用用户已完成过的认证进程中的Cookie等信息发起跨站要求。这些要求看似是由受信任的用户发出,实则是由攻击者构造并发送的

  1. csrf攻击

CSRF(Cross-Site Request Forgery,跨站要求捏造)是一种常见的Web利用程序安全漏洞,攻击者可以利用用户已完成过的认证进程中的Cookie等信息发起跨站要求。这些要求看似是由受信任的用户发出,实则是由攻击者构造并发送的。

攻击流程以下:

  1. 用户在一个网站中进行了登录,得到了一个Cookie;
  2. 用户在没有退出该网站的情况下,访问了攻击者控制的网站;
  3. 在攻击者控制的网站中,构造一个要求,该要求针对原网站;
  4. 发送该捏造的要求,由于用户在原网站中已登录并且缺少必要的安全防护措施,所以要求会被原网站接受并处理。

这类攻击会致使用户信息泄漏、资金转移等风险。以下代码演示了一个简单的CSRF攻击。

假定我们现在有一个网站,其中有一个修改密码的功能:

from flask import Flask, request

app = Flask(__name__)

@app.route('/change_password', methods=['POST'])
def change_password():
    if request.method == 'POST':
        old_password = request.form.get('old_password')
        new_password = request.form.get('new_password')
        # TODO: 对用户进行密码认证,并修改密码
        return 'success'

if __name__ == '__main__':
    app.run()

攻击者构造一个针对这个网站的攻击页面,代码以下:

<html>
<body>
    <form action="http://localhost:5000/change_password" method="POST">
        <input type="hidden" name="old_password" value="123456" />
        <input type="hidden" name="new_password" value="hacked_password" />
        <input type="submit" value="肯定" />
    </form>
</body>
</html>

当用户在该攻击页面中点击提交按钮时,实际上是向原网站发送了一条捏造的要求,从而实现了修改密码的目的。当用户真正需要修改密码时,也将遭到攻击致使密码被修改乃至账号被盗。

为了避免CSRF攻击,需要使用一些机制来检测要求会不会合法,这些机制包括:

  • 使用CSRF token:在要求中增加一个随机生成的token,只有该token与服务端存储的相同时,才认为该要求合法;
  • 检查referer字段:在HTTP协议中,referer字段记录了要求来源的地址,如果referer不是服务端允许的地址,则认为该要求不合法;
  • 验证用户行动:在要求中增加一个仅能由用户完成的验证信息,比如验证码、手势等。
  1. OAuth认证

OAuth(Open Authorization,开放式授权)是一种授权机制,允许用户给第三方利用授权访问受保护的资源,而无需将用户名和密码流露给第三方利用。

OAuth认证的流程以下:

  1. 用户在第三方利用中点击“登录”按钮;
  2. 第三方利用将用户重定向到授权服务器,并告知授权服务器需要访问哪些资源;
  3. 授权服务器要求用户登录并确认授权;
  4. 用户登陆并授权后,授权服务器生成一个访问令牌(access token)并返回给第三方利用;
  5. 第三方利用使用该访问令牌访问受保护的资源;

OAuth认证取得了广泛的使用,许多网站都支持OAuth认证,例如Google、Facebook等。

以下代码演示了怎样使用Python实现OAuth认证:

import requests
import json

# 第一步:构造授权访问要求
auth_url = 'http://example.com/oauth2/authorize?response_type=code&client_id=xxxxxxxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fcallback&scope=email'

# 打开浏览器,让用户授权
print('请在浏览器中授权访问,授权终了后,请复制回调URL中的code')
print(auth_url)

# 等待用户授权终了后,将code输入到控制台
code = input('请输入返回的授权码:')

# 第二步:构造换取访问令牌要求
token_url = 'http://example.com/oauth2/token'

# 构造要求数据
data = {
    'code': code,
    'client_id': 'xxxxxxxxxxx',
    'client_secret': 'xxxxxxxxxxx',
    'redirect_uri': 'http://localhost:8080/callback',
    'grant_type': 'authorization_code'
}

# 发送要求
response = requests.post(token_url, data=data)

# 解析访问令牌
access_token = json.loads(response.text).get('access_token')

# 使用访问令牌访问资源
api_url = 'http://example.com/api/user'
api_headers = {
    'Authorization': 'Bearer {}'.format(access_token),
    'Content-Type': 'application/json'
}
response = requests.get(api_url, headers=api_headers)
print(response.text)

以上代码中,第一步中构造了一个授权访问要求,该要求将用户重定向到授权服务器,并告知授权服务器需要访问哪些资源。

第二步中,我们对授权服务器发送了一条换取访问令牌的要求,并使用授权码作为认证凭据。当认证成功后,授权服务器将生成一个访问令牌并返回给我们。我们使用该访问令牌去访问受保护的资源。

本文来源:https://www.yuntue.com/post/83444.html | 云服务器网,转载请注明出处!

关于作者: yuntue

云服务器(www.yuntue.com)是一家专门做阿里云服务器代金券、腾讯云服务器优惠券的网站,这里你可以找到阿里云服务器腾讯云服务器等国内主流云服务器优惠价格,以及海外云服务器、vps主机等优惠信息,我们会为你提供性价比最高的云服务器和域名、数据库、CDN、免费邮箱等企业常用互联网资源。

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注