8.22MySQLpymysql模块sql注入问题

Posted francis1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.22MySQLpymysql模块sql注入问题相关的知识,希望对你有一定的参考价值。

一、基本查询语句及方法补充

1.concat_ws

  拼接多个

  select concat(name,":",age,":",post,":",salary) from emp;

  select concat_ws(‘:‘,name,age,post,salary) from emp;

  上述语句完全等价

2.exist(了解)

  EXISTS关字键字表示存在。

  在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False。

  当返回True时,外层查询语句将进行查询

  当返回值为False时,外层查询语句不进行查询。

select * from emp
    where exists
    (select id from dep where id > 3);

select * from emp
    where exists
    (select id from dep where id > 250);

二、pymysql模块

1.安装:pip3 insatll pymysql

2.代码连接

import pymysql

conn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123,
    database = day38,
    charset = utf8  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息
sql = select * from teacher
res = cursor.execute(sql)  # 执行传入的sql语句
print(res)  # res是执行语句返回的数据条数

print(cursor.fetchone())  # 只获取一条数据
print(cursor.fetchall())  # 获取所有的数据,返回的结果是一个列表

cursor.scroll(1,absolute)  # 控制光标移动,absolute相对于起始位置,往后移动几位
cursor.scroll(1,relative)  # relative相对于当前位置,往后移动几位

三、sql注入问题

1.注入问题,错误代码

import pymysql

conn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123,
    database = day38,
    charset = utf8  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where username=‘%s‘ and password=‘%s‘"%(username,password)
res = cursor.execute(sql)  # 传入执行的语句

# 用户名正确
username >>>: jason -- jjsakfjjdkjjkjs
password >>>: ‘‘

# 用户名密码都不对的情况
username >>>: xxx or 1=1 --asdjkdklqwjdjkjasdljad
password >>>: ‘‘

 

  sql注入问题,就是利用注释等具有特殊意义的符号,来完成一些骚操作

  后续写sql语句,不要手动拼接关键性的数据

  而是让excute帮你去做拼接

2.excute,正确代码

import pymysql

conn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123,
    database = day38,
    charset = utf8  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where name =%s and password = %s"
res = cursor.execute(sql,(username,password))  # 能够帮你自动过滤特殊符号,避免sql注入的问题
# execute能够自动识别sql语句中的%s,帮你做替换
if res:
    print(cursor.fetchall())
else:
    print(用户名或密码错误)

四、pymysql增删改

1.增删改(以下增删改操作都不生效)

  先代码连接

import pymysql

conn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123,
    database = day38,
    charset = utf8  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

  新增

sql = insert into user(name,password) values("jerry","666")
cursor.execute(sql)

  修改

sql = update user set name = "jasonhs" where id = 1
cursor.execute(sql)

  删除

sql = delete from user where id = 6
cursor.execute(sql)

  以上增删改操作都不生效

2.conn.commit()

  增、改和删操作只执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改

1.增删改操作正确写法

# 新增
sql = insert into user(name,password) values("jerry","666")
cursor.execute(sql)
conn.commit()

# 修改
sql = update user set name = "jasonhs" where id = 1
cursor.execute(sql)
conn.commit()

# 删除
sql = delete from user where id = 6
cursor.execute(sql)
conn.commit()

2.也可以在连接的时候多配一个参数

import pymysql

conn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123,
    database = day38,
    charset = utf8  # 编码千万不要加-,如果写成了utf-8会直接报错
    autocommit = True  # 这个参数配置完成后,增删改操作都不需要再手动加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

# 新增
sql = insert into user(name,password) values("jerry","666")
cursor.execute(sql)

  autocommit = True

  这个参数配置完成后,增删改操作都不需要再手动加conn.commit了

以上是关于8.22MySQLpymysql模块sql注入问题的主要内容,如果未能解决你的问题,请参考以下文章

node.js 的繁琐模块是不是有任何防止 sql 注入的功能?

13 pymysql模块的 基本使用/ sql 注入的问题/增删改查

sql 注入安全过滤-安全模块

MySQL5.7-pymysql模块和SQL注入

SQL注入--SQLMap过WAF--tamper模块使用

Pikahu-SQL注入模块和sqlmap经典用法