day-44mysql
sql注入
a. 登录验证 写sql语句的时候, %传值的时候, 需要加引号: sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd) 上面的sql语句带来的风险是: 例一: username = zekai' # select * from t4 where name = 'zekai' #' and pwd = '' 例二: username = dbsahvbdsha' or 1=1 # select * from t4 where name = 'dbsahvbdsha' or 1=1
上面出现的问题,我们称之为 SQL注入
出现问题的根源是:
因为太过于相信用户的输入, 导致我们在接受用户输入的参数的时候, 并没有对他进行转义
解决SQL注入:
1. 自己手工对用户输入的值进行转义
2. 使用execute()自动进行过滤
sql = "select * from t4 where name = %s and pwd = %s"
cursor.execute(sql,(username, pwd))
#$## 插入一条使用
cursor.execute(sql, ('lxxx', '1234'))
### 插入多条
data = [
('aaaaa', 'aaa'),
('bbbb', 'bbb'),
('ffff', '666'),
('rrrr', '888'),
]
cursor.executemany(sql, data)
try:
cursor.execute(sql, ('lxxx', '1234'))
### 删除和更新的时候, 需要事物提交
conn.commit()
except Exception as e:
conn.rollback()
cursor.lastrowid : 最后一行的行数
事务
一组操作, 要么都成功, 要么都失败
特性:
原子性: 一组操作, 要么都成功, 要么都失败
一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“另开起一个事物”来抵消之前的错误
场景: 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上500元, 我给朋友转账100元(无手续费), 如果,网线断了, 我的钱刚扣,而朋友的钱又没加时, 怎么办? create table t11 ( id int auto_increment primary key, name varchar(32) not null default '', money int not null default 0 )engine=Innodb charset=utf8; insert into t11 (name,money) values ('zekai', 1000), ('eagon', 500);
解决方法:
开启事务 (start transaction)
(执行sql操作)
commit : 提交上面的SQL, 让其生效
rollback: 回滚
show full tables; 显示全部类型
视图
产生的原因:
如果有一个SQL语句频繁的会被使用到,比如说:
select * from t4 where id>12 and id <24;
搞一个映射,或者取一个别名
select * from t4 where id>12 and id <24 === > v1
视图:
select * from v1;
创建视图:
create view v1 as select * from t4 where id>12 and id <24;
修改视图:
alter view v1 as sql语句;
删除视图:
drop view v1;
问题:
如果原生的表数据发生了变化, 那视图会不会发生变化? 也会变化
视图中的数据会不会发生修改? 不会发生修改
应用场景:
MySQL: (DBA)
生成视图View
程序:
调用 select * from v1;
函数:
不要轻易使用
在程序中, 用代码计算, 计算好了, 再传给SQL语句执行
存储过程:
将一大堆 SQL 语句进行封装, 类似于函数, 结果就是存储过程
MySQL服务端:
DBA (写)
a. 简单的存储过程: delimiter // create procedure p1() BEGIN select * from t11; END // delimiter ; 程序: call p1(); b. 传参数: (in) delimiter // create procedure p2( in n1 int, in n2 int ) BEGIN select * from t11 where id > n1; END // delimiter ; 程序: call p2(12, 2) c. 传入参数: (out) delimiter // create procedure p3( in n1 int, out n2 int ) BEGIN select * from t11 where id > n1; set n2 = 1; END // delimiter ; set @v2=123212; call p3(12, @v2); select @v2;
触发器:
向用户表中添加一条数据的同时, 在日志表中也添加一条记录
delimiter // CREATE TRIGGER t1 BEFORE INSERT ON t7 FOR EACH ROW BEGIN insert into t11 (name, money) values ('xxx', 1234); END // delimiter ;
原文地址:https://www.cnblogs.com/klw1/p/11032644.html
- [译]Laravel 5.0 之命令及处理程序
- Deep Photo Styletransfer的一种纯Tensorflow实现,教你如何转换图片风格
- 如何提前体验 Laravel 5.5
- Laravel 4 小技巧两则
- [译]Laravel 5.0 之 ValidatesWhenResolved
- Python机器学习的练习七:K-Means聚类和主成分分析
- [译]Laravel 5.0 之方法注入
- [译]Laravel 5.0 之 Middleware (Filter-Style)
- [译]Laravel 5.0 之目录结构与命名空间
- Python机器学习的练习六:支持向量机
- [译]Laravel 5.0 之路由缓存
- [译]Laravel 5.0 之 表单验证类 (Form Requests)
- 如何在Python中保存ARIMA时间序列预测模型
- Laravel 5.0 发布, 海量新特性!!
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。
- 达梦数据库适配问题
- Angular Component UI单元测试的隔离策略
- 第005课 linux进阶命令(文件查找,文件解压操作详解)
- 没有这 29 款插件的 Chrome 是没有灵魂的
- 第006课 开发板熟悉与体验
- Angular Observable数据类型的单元测试数据准备
- 第007课 裸机开发步骤和工具使用(SourceInght NotePad++使用)
- Angular jasmine.expect单步调试
- 第008课 第1个ARM裸板程序及引申(点亮LED灯)
- SharedPreferences VS MMKV
- 第009课 gcc和arm-linux-gcc和Makefile
- Go 每日一库之 quicktemplate
- 第010课 掌握Jz2440_ARM芯片时钟体系