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

Python中的CSRF攻击与Session管理

CSRF(Cross-site request forgery)攻击是一种Web攻击,它利用了用户已登录了一个网站这个特殊情况,向攻击者的歹意网站发送一个捏造的要求来履行一个未经许可的操作,比如修改用户的密码、转账等。Python中可使用Flask-WTF来防

CSRF(Cross-site request forgery)攻击是一种Web攻击,它利用了用户已登录了一个网站这个特殊情况,向攻击者的歹意网站发送一个捏造的要求来履行一个未经许可的操作,比如修改用户的密码、转账等。Python中可使用Flask-WTF来防御CSRF攻击。

首先安装Flask-WTF:

pip install flask-wtf

然后在Flask利用中导入Flask-WTF并配置密钥:

from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)

# 自定义密钥
app.config['SECRET_KEY'] = 'my secret key!'

# 启用CSRF保护
csrf = CSRFProtect(app)

在需要防御CSRF攻击的表单中,需要添加一个隐藏的input标签,用于传递CSRF令牌:

<form method="post" action="/submit">
  {{ form.hidden_tag() }}
  <input type="text" name="username">
  <input type="password" name="password">
  <button type="submit">提交</button>
</form>

在Flask-WTF中,表单可以通过Form类定义,以下所示:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired()])
    password = PasswordField('密码', validators=[DataRequired()])
    submit = SubmitField('登录')

在视图函数中,可使用form.validate_on_submit()方法来进行表单验证:

from flask import Flask, render_template, request, flash, redirect
from .forms import LoginForm

app = Flask(__name__)
app.config['SECRET_KEY'] = 'my secret key!'

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        username = form.username.data
        password = form.password.data
        # 验证用户名密码会不会正确
        if username == 'pidancode.com' and password == '123456':
            flash('登录成功!')
            return redirect('/')
        else:
            flash('用户名或密码毛病!')
    return render_template('login.html', form=form)

session管理是一种在Web开发中常见的技术,用于存储用户的登录信息、购物车等信息。在Flask中,Session可以通过Flask-session扩大实现。

首先安装Flask-Session:

pip install flask-session

然后在Flask利用中配置Session:

from flask import Flask
from flask_session import Session

app = Flask(__name__)

# 配置Session
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis()
app.config['SESSION_COOKIE_NAME'] = 'my_cookie'
app.config['SECRET_KEY'] = 'my secret key!'

# 启用扩大
Session(app)

上面配置支持通过Redis存储Session数据,SESSION_COOKIE_NAME参数指定了Session的cookie名称。在视图函数中,可以通过session变量来存储或获得Session数据:

from flask import session, redirect, url_for

@app.route('/set_session')
def set_session():
    session['username'] = 'pidancode.com'
    return redirect(url_for('index'))

@app.route('/')
def index():
    username = session.get('username')
    return '用户名:{}'.format(username)

上面代码中,在/set_session路由处理函数中,存储了一个键为username,值为pidancode.com的Session信息。在/index路由处理函数中,通过session.get获得到了username对应的值,并显示在页面中。

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

关于作者: yuntue

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

为您推荐

发表回复

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