Navicat-pymysql-sql注入问题
一、Navicat 可视化工具的使用
1、Navicat [1] 是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。
它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,
让你可以以安全并且简单的方式创建、组织、访问并共用信息。
#要求掌握
1;测试+连接数据库
2:新建库
3:新建表,新增字段+类型+约束条件的创建
4:设计表:外键
5:新建查询
6:建立表的模型
7:转储/运行SQL文件
8:通过模型多表之间查询,输入命令 #注意
批量加注释:ctrl+?建
批量去注释:CTRL+shift+?建
2、 软件操作界面及使用注意事项:
3、新建库时注意事项:
4、可以把建好的表转储为SQL文件保存下来,可以把新的SQL文件直接添加并运行(可以直接利用别人建好的框架模型或数据)
二、练习题:(多表之间的查询)
1、查询所有的课程的名称以及对应的任课老师姓名
4、查询平均成绩大于八十分的同学的姓名和平均成绩
7、 查询没有报李平老师课的学生姓名
8、 查询没有同时选修物理课程和体育课程的学生姓名
9、 查询挂科超过两门(包括两门)的学生姓名和班级 # 解题步骤:
把复杂的问题拆分,按条件拆分一步一的写,再基于上一次查询的结果再做条件筛选
1:查询所有的课程的名称以及对应的任课老师姓名
解题思路:(1):先采用连表操作 inner join(内连接把老师和课程的信息查找)
select *from course inner join teacher on course.teacher_id =teacher.tid; 内连接查找
(2):在找到老师和课程的基础上,再查找课程对应的老师信息
把 * 换成要查找的内容即可:
SELECT
course.cname,
teacher.tname
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid;
2:查询平均成绩大于八十分的同学的姓名和平均成绩
'''SELECT
student.sname,
t1.avg_num
FROM
student # 第二步:查询学生符合符合条件的学生 再用avg
INNER JOIN (
SELECT
student_id,
avg(num) AS avg_num
FROM
score # 第一步:先查找平均成绩大于80分的同学
GROUP BY
student_id
HAVING # 分组后的条件筛选
avg(num) > 80
) AS t1 ON student.sid = t1.student_id;'''
3: 查询没有报李平老师课的学生姓名(找出报名李平老师课程的学生,然后取反就可以)
SELECT
student.sname
FROM
student
WHERE
sid NOT IN (
SELECT DISTINCT
student_id
FROM
score
WHERE
course_id IN (
SELECT
course.cid
FROM
course
INNER JOIN teacher ON course.teacher_id = teacher.tid
WHERE
teacher.tname = '李平老师'
)
);
4、 查询没有同时选修物理课程和体育课程的学生姓名(没有同时选修指的是选修了一门的,
思路是得到物理+体育课程的学生信息表,然后基于学生分组,统计count(课程)=1)
SELECT
student.sname
FROM
student
WHERE
sid IN (
SELECT
student_id
FROM
score
WHERE
course_id IN (
SELECT
cid
FROM
course
WHERE
cname = '物理'
OR cname = '体育'
)
GROUP BY
student_id
HAVING
COUNT(course_id) = 1
);
5、查询挂科超过两门(包括两门)的学生姓名和班级
select student.sname,class.caption from class INNER JOIN student
on class.cid = student.class_id
WHERE student.sid in
(select student_id from score where num < 60
GROUP BY student_id
HAVING COUNT(course_id) >=2)
三、pymysql 模块
命令行安装: pip insatll mysql 用Python来实现操作mysql
import pymysql conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8' # 编码千万不要加- 如果写成了utf-8会直接报错
)
# 向mysqld服务端发送请求连接 cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象 以字典的形式返回查询出来的数据
# 键是表的字段 值是表的字段对应的信息
sql = 'select * from teacher' cursor.execute(sql) # 执行传入的sql语句
print(cursor.fetchone()) # 只获取一条数据
print(cursor.fetchone()) # 只获取一条数据 # cursor.scroll(2,'absolute') # 控制光标移动 absolute相对于其实位置 往后移动几位
cursor.scroll(1,'relative') # relative相对于当前位置 往后移动几位
print(cursor.fetchall()) # 获取所有的数据 返回的结果是一个列表
四、mysql 注入问题
解决在输入没有密码或者用户名错误的情况下也能访问数据的问题。
# 2.代码链接
import pymysql
#链接
conn=pymysql.connect(
host='localhost',
user='root',
password='',
database='egon',
charset='utf8')
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 以字典的方式显示数据 # 3.pymysql操作数据库
#执行sql语句
user = input(">>>:").strip()
pwd = input(">>>:").strip()
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号 rows=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
# 获取真实数据cursor.fetchone(),cursor.fetchall(),cursor.fetchmany(),类似管道取值,获取一条,所有,多条 cursor.scroll(1,'relative') # 相对移动
cursor.scroll(3,'absolute') # 绝对移动 cursor.close()
conn.close()
sql注入的问题:
通过修改验证方式,解决在没有输入正确的用户名和密码时也能获取数据的情况
import pymysql conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8' # 编码千万不要加- 如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor) username =input('username>>>:').strip()
password = input('password>>>:').strip() sql ="select * from userinfo where name = %s and password = %s"
print(sql)
res = cursor.execute(sql,(username,password)) # execute 会自动识别sql语句中的%s 帮你做替换
if res:
print(cursor.fetchall())
else:
print("用户名和密码错误!") 结果:
username>>>:james
password>>>:123
select * from userinfo where name = %s and password = %s
[{'id': 2, 'name': 'james', 'password': '123'}]
"""
sql注入 就是利用注释等具有特殊意义的符号 来完成一些骚操作
后续写sql语句 不要手动拼接关键性的数据
而是让excute帮你去做拼接 """
sql ="select * from userinfo where name = %s and password = %s" %(username,password)
res = cursor.execute(sql) 如果这么写的话会出现注入问题:利用mysql -- 注释的语法实现破解密码 如输入:Jack‘-- bhgdj 或 xxx' or 1=1 没有密码不知道用户名也能获取数据
五、增删改
conn.commit() 手动提交
autocommit = True 自动提交
import pymysql conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '',
database = 'day38',
charset = 'utf8', # 编码千万不要加- 如果写成了utf-8会直接报错
autocommit = True # 这个参数配置完成后 增删改操作都不需要在手动加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'insert into userinfo (name,password) values("jerry","666")'
# sql = 'update userinfo set name = "jasonhs" where id = 1'
# sql = 'delete from userinfo where id = 2'
cursor.execute(sql) # conn.commit() """
增删改操作 都必须加一句
conn.commit()操作
"""
Navicat-pymysql-sql注入问题的更多相关文章
- Navicat,SQL注入,pymysql模块
# 关键字exists(了解) 只返回布尔值 True False 返回True的时候外层查询语句执行 返回False的时候外层查询语句不再执行 select * from emp where exi ...
- python-pymysql防止sql注入攻击介绍
目录 pymysql sql 注入攻击 调用存储过程 pymysql pymysql 是一个第三方模块,帮我们封装了 建立表/用户认证/sql的执行/结果的获取 import pymysql # 步骤 ...
- Navicat工具、pymysql模块 sql注入
cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...
- MySQL 之Navicat Premium 12安装使用、pymysql模块使用、sql注入问题的产生与解决
本文内容提要: Navicat Premium 12 的介绍.使用. pymysql模块的使用 sql注入问题的产生与解决 -------------------------------------- ...
- MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05
目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...
- 数据库——可视化工具Navicat、pymysql模块、sql注入问题
数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...
- MySQL多表查询,Navicat使用,pymysql模块,sql注入问题
一.多表查询 #建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_i ...
- pymysql的使用及sql注入
pymysql简介 pymysql是python操纵mysql的一个模块,本质上是一个socket客户端 pymysql使用 准备数据 #创建数据库db2,如果已存在,请忽略 CREATE DATAB ...
- 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识
昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...
- pymysql 解决 sql 注入问题
1. SQL 注入 SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作. 即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数 ...
随机推荐
- WebSocket在建立连接时通过@PathParam获取页面传值
最近用Java下使用WebSocket,有一个需求,在页面与Java后台建立连接的时候获取页面上提供的参数,也就是在@OnOpen注解的方法里面获取一次页面的参数,有一个很简单的方法可以获得.即使用@ ...
- git push 现有代码到一个新的分支
git push origin HEAD:task/xxx-test-local git push的一般形式为 git push <远程主机名> <本地分支名> <远程 ...
- 1.1 js中函数定义解析(学习笔记)
1.1.1函数的分类 函数声明式 :使用function声明函数,并指定函数名. 函数表达式:使用function声明函数,但未指定函数名. 函数表达式2.匿名函数,匿名函数有很多作用,赋予一个变量则 ...
- textField 基本属性
_textField.frame = CGRectMake(0, 0, 200, 50); _textField.delegate = self; _textField.text = str; [_t ...
- iOS 中的延时操作方法
1. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_q ...
- 201712-2 游戏 Java
思路: 第一感觉有点像约瑟夫环.想到用队列解决比较好理解 import java.util.LinkedList; import java.util.Queue; import java.util.S ...
- es和数据库关系对比
es类比传统关系型数据库: Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -& ...
- vue 动画框架Animate.css @keyframes
<script src="vue.js"></script> <link rel="stylesheet" href=" ...
- h5-钟表动画案例
1.html代码 <div class="clock"> <div class="line line1"> <div class= ...
- java 面向对象概述, 函数解析
函数:class FunctionDemo { public static void main(String[] args) { /* int x = 4; System.out.println(x* ...