CSRF攻击原理:

配置信息

import os
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = False SECRET_KEY = os.urandom(30)

创建模型:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

from exts import db

class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True) # int类型的主键,SQLAlchemy会自动设为自增
email = db.Column(db.String(50), nullable=False)
username = db.Column(db.String(50), nullable=False)
password = db.Column(db.String(50), nullable=False)
deposit = db.Column(db.Float, default=0)

主入口

from flask import Flask
from exts import db
import config app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) if __name__ == '__main__':
app.run(debug=True)

manager

from flask_script import Manager
from app import app
from exts import db
from flask_migrate import Migrate, MigrateCommand
from models import User # 在此导入模型 manager = Manager(app)
Migrate(app, db)
manager.add_command('db', MigrateCommand) if __name__ == '__main__':
manager.run()

初始化:python manager.py db init

生成迁移脚本:python manager.py db migrate

把迁移脚本映射到数据库:python manager.py db migrate

form验证

from wtforms import Form, StringField, FloatField
from wtforms.validators import Email, Length, EqualTo, InputRequired class RegistForm(Form):
email = StringField(validators=[Email(message='邮箱格式错误')])
username = StringField(validators=[Length(3, 20, message='用户名长度3~20位')])
password = StringField(validators=[Length(3, 20, message='用户名长度3~20位')])
check_password = StringField(validators=[EqualTo('password', message='两次密码不一致')])
deposit = FloatField(validators=[InputRequired(message='设置余额')])

注册的视图

from flask import Flask, render_template, views, request
from forms import RegistForm
from exts import db
import config
from models import User app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) @app.route('/')
def index():
return render_template('index.html') class RegistView(views.MethodView):
""" 注册视图 """ def get(self):
return render_template('regist.html') def post(self):
form = RegistForm(request.form)
if form.validate():
email = form.email.data
username = form.username.data
password = form.password.data
deposit = form.deposit.data
user = User(email=email, username=username, password=password, deposit=deposit)
db.session.add(user)
db.session.commit()
return '注册成功'
else:
return f'注册失败,错误如下:{form.errors}' app.add_url_rule('/regist/', view_func=RegistView.as_view('regist')) if __name__ == '__main__':
app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>银行首页</title>
</head>
<body>
<h1>欢迎来到宇宙银行</h1>
<ul>
<li><a href="{{ url_for('regist') }}">去注册</a></li>
</ul>
</body>
</html>

regist.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页</title>
</head>
<body>
<form action="" method="post">
<table>
<tbody>
<tr>
<td>邮箱:</td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type="text" name="check_password"></td>
</tr>
<tr>
<td>设置余额:</td>
<td><input type="text" name="deposit"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="点击注册"></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>

注册两个用户

六十二:CSRF攻击与防御之系统准备之注册功能的更多相关文章

  1. 六十三:CSRF攻击与防御之系统准备之登录与转账功能

    登录功能 在forms里面添加验证 class LoginForm(Form): email = StringField(validators=[Email(message='邮箱格式错误')]) p ...

  2. 六十四:CSRF攻击与防御之系统准备之病毒网站转账实现

    准备一个页面或图片,用于用户访问 一:表单方式 视图 from flask import Flask, render_template app = Flask(__name__) @app.route ...

  3. “全栈2019”Java第六十二章:接口与常量详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. FastAPI(六十二)实战开发《在线课程学习系统》需求分析

    前言 基础的分享我们已经分享了六十篇,那么我们这次分享开始将用一系列的文章分享实战课程.我们分享的系统是在线学习系统.我们会分成不同的模块进行分享.我们的目的是带着大家去用fastapi去实战一次,开 ...

  5. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  6. Spark2.x(六十二):(Spark2.4)共享变量 - Broadcast原理分析

    之前对Broadcast有分析,但是不够深入<Spark2.3(四十三):Spark Broadcast总结>,本章对其实现过程以及原理进行分析. 带着以下几个问题去写本篇文章: 1)dr ...

  7. 六十六:CSRF攻击与防御之CSRF防御之ajax防御和ajax封装

    app里面还是要绑定CSRFProtect from flask_wtf import CSRFProtect # flask_wtf 已经提供CSRF的防御手段CSRFProtect(app) # ...

  8. 六十五:CSRF攻击与防御之CSRF防御之form表单防御

    防御原理,将csrf_token放到session中,再将session放到cookie中 实现: from flask_wtf import CSRFProtect # flask_wtf 已经提供 ...

  9. Python学习(三十二)—— Django之视图系统

    转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...

随机推荐

  1. linux基础—课堂随笔05_文本三剑客之SED

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  2. facenet中pairs文件制作

    1.对图片进行重命名 """Rename the image based on the folder name""" import os i ...

  3. BZOJ 最大公约数 (通俗易懂&效率高&欧拉函数)

    题目 题目描述 给定整数\(N\),求\(1 \le x,y \le N\)且\(gcd(x,y)\)为素数的数对\((x,y)\)有多少对. \(gcd(x,y)\)即求\(x,y\)的最大公约数. ...

  4. endpoint

    你把机器关机一次,估计被你只写满不读,限速死锁了,因为目前没有心跳控制

  5. VSCode远程连接Docker

    一.Docker开启远程访问 [root@local host ~]# vi /lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/ ...

  6. Java应用的理解

    一.程序 对每个程序来说,不管用什么语言开发出来的,他的功用分为三种: 1.接收输入流 2.处理数据 3.传出输出流 接收输入流,包括从网络.文件.用户输入等:传出输出流,包括网络.文件.显示设备等: ...

  7. Java通过腾讯邮箱发送邮件

    private static void sendEmaill() { Properties prop = new Properties(); //协议 prop.setProperty("m ...

  8. Windows安装Redis并添加本地自启动服务

    概况 在windows本地搭建redis缓存,添加到本地计算机的服务中,保证每次开机自动启动服务. 第一步:下载redis(我的是计算机win10,64位) https://github.com/Mi ...

  9. Java常用类(二) Scanner类和大数类

    二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学J ...

  10. 云原生相关名词Istio发音

    服务网格词汇 Istio,希腊语言中大概是风帆的意思, 发音  [iːst'iəʊ] ,相当于中文的 伊斯特亿欧