首页 > 数据库 >数据库了解及部分掌握

数据库了解及部分掌握

时间:2023-07-14 17:47:27浏览次数:32  
标签:rows 掌握 数据库 视图 cursor 了解 sql print password

sql注入问题

sql注入原因是由于特殊符号的组合会产生特殊的效果,实际生活中,尤其是在注册用户名时,会明显提示很多特殊符号不能使用,原因一样,设计到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。

利用一些语法的特性 书写一些特点的语句实现固定的语法
MySQL利用的是MySQL的注释语法
select * from user where name='jason' -- jhsadklsajdkla' and password=''

select * from user where name='xxx' or 1=1 -- sakjdkljakldjasl' and password=''

当在登录过程中用户名输入mysql中的注释语句时,也会显示登录成功,以下是会产生注入问题的代码。

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='yee',
    charset='utf8',
    autocommit=True
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('>>>:').strip()
password = input('>>>:').strip()
sql = "select * from userinfo where username='%s' and password='%s'" % (username, password)
# 不要手动拼接数据 先用%s占位 之后将需要拼接的数据直接交给execute方法即可
res = cursor.execute(sql)  # 自动识别sql里面的%s用后面元组里面的数据替换
if res:
    print("登录成功")
    print(cursor.fetchall())
else:
    print("用户名或密码错误")

 

以下是解决注入问题的代码

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='yee',
    charset='utf8',
    autocommit=True   #这里默认autocommit=False 也就是自动提交,增删改需要二次确定提交,所以当不填写这个,或者为false就需要在增删改的后面加入conn.commit()
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('username:').strip()
password = input('password:').strip()

sql = "select * from userinfo where username = %s and password = %s "     #注意这里%s不能加引号,不然会报错
print(sql)
res =cursor.execute(sql,(username,password))      #这里以元组的形式传入进行匹配,因为execute里有正则表达式,解决了这个问题
data = cursor.fetchall()
if data:
    print('登录成功')
else:
    print('用户名或密码错误')

 

pymysql的补充

关于增删改查进数据库中

只有查可以输出结果,而删改查的操作设计到数据的修改,需要二次确认,查不需要。

插入数据(连接与上述都一致,以下只写关键部分)

插入单挑数据:

#插入单条数据写法一:
sql = "insert into userinfo(username,password) values (%s,%s)"
rows = cursor.execute(sql,('qxx',456))
print(rows)
#插入单条数据写法二:
sql = "insert into userinfo(username,password) values ('qxx',456)"
rows = cursor.execute(sql)
print(rows)

插入多条数据:

#写法一:
sql = "insert into userinfo(username,password) values (%s,%s)"
rows = cursor.executemany(sql,[('qxx',456),('qxx',456)])    #将execute改为executemany
print(rows)

#写法二:
sql = "insert into userinfo(username,password) values ('qxx',456),('qxx',456)"
rows = cursor.execute(sql)
print(rows)

删除数据:

sql = 'delete from userinfo where id = 1'
rows = cursor.execute(sql)
print(rows)

修改数据:

sql = 'update userinfo set username="yyqx" where id = 2'
rows = cursor.execute(sql)
print(rows)

 

 视图

视图就是通过查询得到一张虚拟表,保存下开,下次可以直接使用,视图也是表。

使用视图的原因是:如果频繁操作一张由拼表来建立虚拟表,就可以建立视图,方便后续使用。

固定语法:

创建视图:create view 表名/视图名 as 虚拟表的查询sql语句

删除视图:drop view 视图表名

ps:在硬盘中,视图只有表结构,没有表数据文件;视图通常只是用来查询,尽量不要去修改视图中的数据。

开发过程中是否会使用视图?

不会,视图是mysql的功能,如果项目里面大量使用视图,也就意味着后期想要扩张某个功能时,这个功能恰好又需要对视图修改,意味着需要现在mysql这边将视图修改,再去应用程序中修改对应的sql语句,这就涉及到跨部门的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能。

触发器

触发器是在满足对某张表数据的增删改的情况下自动触发的功能称之为触发器。

触发器专门针对我们对某一张表数据的insert、删delete、改update的运行,这类行为一旦执行,就会触发触发器的执行,即自动运行另一段sql代码

 

标签:rows,掌握,数据库,视图,cursor,了解,sql,print,password
From: https://www.cnblogs.com/YeeQX/p/17554594.html

相关文章

  • 13-数据库安全
    Mssql数据库mssql安全性概述:就是用来保护数据,可以决定哪些用户可以登录到服务器,用户可以对哪些数据库执行操作或管理任务等。他的安全体系结构顺序上可以分为“认证”“授权两个部分”,安全机制可以分为5个层级。客户端、网络传输,实例级别,数据库级别、对象级别五个层级安全机......
  • IoT 场景下 TDengine 与老牌时序数据库怎么选?看看这份TSBS报告
    上周一,TDengine正式发布了IoT场景下基于TSBS的时序数据库(TimeSeriesDatabase,TSDB)性能基准测试报告。该报告模拟虚拟货运公司车队中一组卡车的时序数据,预设了五种卡车规模场景,在相同的AWS云环境下运行了TDengine3.0、TimescaleDB2.10.1和InfluxDB1.8.10,从四大维度进......
  • python之数据库:SQL注入问题,视图,触发器,事务,存储过程,函数,流程控制,索引,慢查询
    SQL注入问题(了解现象)importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True#......
  • Clickhouse、Mysql、Presto数据库解析Json数据
    一、Clickhouse解析Json1、visitParamExtractBool(json,name)→提取json中的name字段,返回UInt8,0或1  例:visitParamExtractBool('{"name":true}','name')ASbool2、visitParamExtractInt(json,name)→提取json中的name字段,返回Int型的值  例:visitParamExtractInt......
  • 【AGC】云数据库开发常见问题汇总
    ​ 【问题背景】近期越来越多的开发者通过SDK使用云数据库,云数据库是一款支持端云数据协同管理、可扩展的Serverless数据库产品,提供简单易用的多平台原生SDK,您的应用可以通过SDK直接访问云侧数据库。同时,云数据库还支持通过ServerSDK直接管理云侧数据,实现云侧数据的高效管理。......
  • QGIS在Windows上下载安装与建立空间数据库连接
    场景PostGIS在Windows上的下载与安装:PostGIS在Windows上的下载与安装_霸道流氓气质的博客在上面安装postGIS成功的基础上,怎样下载安装QGIS并建立与空间数据库的连接。QGIS简介QGIS(原称QuantumGIS)是一个用户界面友好的开源桌面端软件,支持数据的可视化、管理、编辑、分析以及印刷地......
  • 传奇数据库教学-传奇MagicDb、MonsterDb、StditemDb数据库说明
    MagicDb:是你所修炼的法术和各种技能.(1)magsid物品代号(2)magname物品名称(3)effecttype效果属性(4)effect效果(放此魔法所产生的动画效果)(5)spell每次耗用魔法值(6)defspell升级后增加的每次耗用魔法值(7)defpower升级后增加的威力(8)defmaxpower升级后增加的最大(9)job......
  • 10分钟带你了解AI人工智能机器人技术都有哪些常见种类
    一、什么是人工智能人工智能技术是一种模拟和扩展人类智力的计算机系统和应用程序。它可以学习、理解、推理、适应和自我修复。在当今社会中,人工智能技术已经成为了各行各业的关键技术,如医疗保健、金融、交通、能源等等。除此之外,人工智能技术还可以用于监视和预测自然灾害、提......
  • 教你快速掌握两个div在同一行显示css如何实现
    我们都知道div是一个块元素,块元素的特点是,独占一行,从上往下排列,但是有时候我们在页面排版的时候需要从左往右横着排列,想要实现这样的效果方法有很多,首先先来看一下,默认情况下的2个div的效果如下代码如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF......
  • 数据库导出指定的时间段
    #!/bin/bashexportPATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'USER=admin2PASS=L4bAWUye2A4JNN!DB_NAME=ng_kboss_personnel#导出mysql-u$USER--password="$PASS"$DB_NAME-Ne"SELECT*FROMng_attendance_si......