朗读

python和mysql交互(sql注入原理及预防)

文章目录[x]
  1. 1:模块安装
  2. 2:python和mysql交互
  3. 2.1:模块具体使用
  4. 3:例子
  5. 4:SQL注入

mysql本身是小生上一学期的专业课,然后前一段时间学了python,和数据库交互肯定是少不了的事情。然后这中间还涉及到了SQL注入的问题。SQL注入是属于web渗透测试的内容,最早的时候我其实想学的就是这,但是现在很长时间估计小生都不会投入时间学这个了,毕竟精力是有限的,要有所取舍。

前言

其实python和mysql交互版式是固定的,就像文件、socket操作一样,都是先打开,再关闭。主要难的还是SQL语句的书写。

还有就是用到了pymysql这个库(这里指的是python3,Python2种应该是MySQLdb模块),这个库默认是不带的,所以需要自己安装。

mysql注入以前只是粗略的知道,直到学完交互才似有所悟~~(其实就是程序员大意格式没写正规)

环境(Linux环境):

mysql,Navicat

模块安装


至于mysql,Navicat的安装招人了就不说了。主要说模块的安装。正常解释器是不自带pymsql的,可先引入一下看一下是否存在该模块

证明已经存在,如果不能导入模块则证明不存在,需要安装。用下面指令安装

pip install pymysql

 

这里需要说的一点是,如果因为网络问题则需要进行软件源更换,具体方法文件目录可以在百度搜一下。

这里说一下,我的是深度系统,所以在下面这个目录

除此之外,当然你也可以在pip后面加一个-i参数

pip install pymysql -i 镜像源网址

 

下面的都能用

pip
目前可用源:
http://pypi.douban.com/ 豆瓣
http://pypi.hustunique.com/ 华中理工大学
http://pypi.sdutlinux.org/ 山东理工大学
http://pypi.mirrors.ustc.edu.cn/ 中国科学技术大学
http://mirrors.aliyun.com/pypi/simple/ 阿里云
https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学

 

python和mysql交互


这里的关闭步骤调换之后并不会报错,但是尽量不要调换

模块具体使用

先引入模块

from pymysql import *

 

创建connect连接

conn = connect(host='localhost',port=3306,database='数据库名称',user='root',password='密码',charset='utf8')

 

注意这里的utf-8尽量不要省,其他的都是套路(其他常见编码格式:GBK、GB2312、GB18030等)

获得cursor对象

cs1 = conn.cursor()

执行语句

count = cs1.execute('select * from student')

注意这里返回的对象只是受影响的行数的引用。

下面是关闭连接的用法-->固定的呢

# 关闭Cursor对象
cs1.close()
# 关闭Connection对象
conn.close()

connection对象还有一个提交的方法

  • commit() 提交

cursor对象的方法

  • fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
  • fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

例子


如现在我在Navicat上创建一个学生表

下面我用下面代码交互一下(注意这种写法是不安全的,会被注入

 

from pymysql import *

def main():

find_name = input("请输入要查询的名字:")

# 创建Connection连接
conn = connect(host='localhost',port=3306,user='root',password='密码',database='test',charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()

sql = 'select * from student where s_name="%s"' % find_name
print("""sql===>%s<====""" % sql)
# 执行select语句,并返回受影响的行数:查询所有数据
count = cs1.execute(sql)

# 打印受影响的行数
print("受影响的行数:%d" % count)
print("*"*50)
# 获取查询的结果
# result = cs1.fetchone()
result = cs1.fetchall()
# 打印查询的结果
print(result)
# 关闭Cursor对象
cs1.close()
# 关闭Connection对象
conn.close()

if __name__ == '__main__':

main()

 

执行结果

SQL注入


就上面的代码,因为书写不规范,是存在SQL注入的。如我现在输入一个,看一下执行效果

" or 1=1 or "

看一下上面的结果是不是数据库全被曝出来了,这只为啥呢?我们可以分析一下这条语句

所以这种方式是很不安全的,下面我们看一下安全的写法-->就是构造一个参数

 

下面再来执行一下

我们发现数据库的内容曝不出来了

最后

因此,我们写代码时应该注意代码规范,养成一个良好的习惯这很重要

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00