Python中的CSRF攻击与浏览器安全策略

2023-04-17 00:00:00 攻击 浏览器 安全策略

CSRF攻击(Cross-Site Request Forgery)的原理是攻击者通过恶意网站或其他方式,向用户浏览器发送一些包含伪造的cookie或参数的请求,如果用户浏览器当前已经登录了需要认证的网站,那么这些请求就会包含用户合法的认证信息,从而遭受攻击。这种攻击可以导致各种安全问题,比如盗取用户信息、篡改数据、恶意转账等。

浏览器有一些安全策略可以防止此类攻击,其中之一就是Same Origin Policy(同源策略)。同源策略要求网页只能从同一域名下加载脚本、样式表和图像等资源,这样在浏览器中打开的一个页面只能与同源页面通信,而不能跨域访问其他页面的数据和资源。同源策略可以在一定程度上防止CSRF攻击。

接下来我们使用Python Flask框架演示一下CSRF攻击和如何防御。

首先,我们要配置一个包含CSRF token的表单,防止伪造请求:

from flask_wtf.csrf import CSRFProtect
from flask_wtf import FlaskForm
from wtforms import StringField

app = Flask(__name__)
app.secret_key = 'secret'
csrf = CSRFProtect(app)

class MyForm(FlaskForm):
    name = StringField('name')

@app.route('/form', methods=['GET', 'POST'])
def my_form():
    form = MyForm()
    if form.validate_on_submit():
        return 'Hello, ' + form.name.data
    return render_template('myform.html', form=form)

然后我们编写一个伪造网站的代码来攻击上面的表单:

from urllib.request import urlopen, Request
from urllib.parse import urlencode

url = 'http://localhost:5000/form'
data = {'name': 'pidancode.com'}
data = urlencode(data).encode('utf-8')
req = Request(url, data, method='POST')
response = urlopen(req)
print(response.read())

运行这段代码,可以看到它向上面的表单发送了一个POST请求,但是由于CSRF token不正确,请求被拒绝了。这样我们就防止了CSRF攻击。

相关文章