pymysql模块使用和简单sql注入及解决方法

pymysql使用

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'db666',
    charset = 'utf8' # 编码千万不要加-
) # 连接数据库

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象(就是用来帮你执行命令的)
"""
cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
"""
sql = 'select * from userinfo;'
res = cursor.execute(sql)
# print(res) # execute返回的是你当前sql语句所影响的行数,该返回值一般不用

# 获取命令执行的查询结果
# print(cursor.fetchone()) # 只拿一条,返回数据本身(字典)
# print(cursor.fetchall()) # 拿所有(返回列表,列表套多个字典)
# print(cursor.fetchmany(1)) # 可以指定拿几条(返回列表,列表套字典)

print(cursor.fetchone())
print(cursor.fetchone()) # 读取数据类似于文件光标的移动
# cursor.scroll(1,'relative') # 相对于光标所在的位置继续往后移动1位
cursor.scroll(1,'absolute') # 相对于数据的开头往后继续移动1位
print(cursor.fetchall())
import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    passwd = '123456',
    db = 'db666',
    charset = 'utf8',
    autocommit = True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)

#
sql = 'insert into user(name,password) values(%s,%s)'
# rows = cursor.execute(sql,('jackson',123))
rows = cursor.executemany(sql,[('aaa',123),('sss',123),('ddd',123)]) # 插入多条数据
print(rows)
# conn.commit() # 确认

# 修改
# sql = 'update user set name="jasonNB" where id=1'
# rows = cursor.execute(sql)
# print(rows)
# conn.commit() # 确认

# 删除
# sql = 'delete from user where id=8'
# rows = cursor.execute(sql)
# print(rows)
# conn.commit() # 确认

#
# sql = 'select * from user'
# cursor.execute(sql)
# print(cursor.fetchall())

"""
增删改查
    增删改的操作涉及到数据的修改
    需要二次确认(conn.commit()或者autocommit = True(autocommit默认为False)
"""

简单sql注入及解决方法

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123456',
    database = 'db666',
    charset = 'utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('>>>:')
password = input('>>>:')

# sql = "select * from user where name='%s' and password='%s'" % (username,password)
sql = "select * from user where name=%s and password=%s"
# 不要手动用'%s'拼接数据,先用%s占位,之后将需要拼接的数据直接交给execute方法即可
print(sql)
# rows = cursor.execute(sql)
rows = cursor.execute(sql,(username,password)) # 自动识别sql里面的%s用后面元组里面的数据替换,并且把特殊符号过滤掉
if rows:
    print('登录成功')
    print(cursor.fetchall())
else:
    print('用户名或密码错误')

"""
sql注入:
    登录的时候输入:jason' -- haha或jason' # haha
        sql=select * from user where name='jason' -- haha' and password=''
            在sql中,(--/#)属于注释,所以这样就只校验了用户名没有校验密码
    登录的时候输入:asd' or 1=1 -- asd
        select * from user where name='asd' or 1=1 -- asd' and password=''
            加了or条件,这个时候只要or后面判断是正确的,即使用户名错误也不会校验,而且也把密码校验注释了
日常生活中,很多软件在注册的时候,都不能含有符号,因为怕构造出特定的语句入侵数据库,造成数据泄露
敏感的数据,不要自己做拼接
"""
while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/15116655.html