python使用mysql,sql注入问题

python使用mysql

import pymysql


conn = pymysql.connect(
    host = '127.0.0.1',          # 连接地址
    port = 3306,                   #端口
    user = root,                    #用户名  
    password = '',                 #密码
    database = 'db',              #库名称
    charset = 'utf8'               #编码格式   utf8,不是utf-8
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)         #产生一个游标,以字典的形式返回查询出来的数据,键是表的字段,值是表字段对应的信息
sql = select * from userinfo        # 写sql语句
cursor.execute(sql)              # 执行传入的sql语句  
print(cursor.fetchone())        #拿到表中一条数据
print(cursor.fetchone())   
print(cursor.fetchone())   
cursor.scroll(1,'absolute')      #absolute绝对移动,前面数字写几,就相对于起始位置向后移动几位
cursor.srcoll(1,'relative')       #relative相对移动,前面写几,就相对于当前位置向后移动几位
print(cursor.fetchall())          #拿到表中所有的数据

sql注入问题

conn = pymysql.connect(
    host = '127.0.0.1',       
    port = 3306,            
    user = root,                    
    password = '',                 
    database = 'db',             
    charset = 'utf8'               
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)
username = input('请输入用户名:')
password = input('请输入密码:')
sql = "select * from userinfo where name = '%s' and password ='%s'" %s(username, password)
res = cursor.execute(sql)
if res:
    print(cursor.fetchall())
else:
    print('账号或密码错误')

我们用上述一段代码诠释一下sql注入的问题, 当我们输入正确的账号密码的时候,发现可以正常打印字段数据,当我们输入错误账号或密码时,就显示账号密码错误

以我们只知道用户名为例

竟然查到了用户的所有信息,这个是根据 -- 注释做到的sql注入

 

 

假如我们账号密码都不知道,那么如何用sql注入去获取网站的用户信息呢

在我们对账号密码毫不知情的情况下,我们使用or判断条件的成立,再加上 --注释,可以获取到网站所有的用户信息

根据以上两个问题我们应该如何解决呢?

conn = pymysql.connect(
    host = '127.0.0.1',       
    port = 3306,            
    user = root,                    
    password = '',                 
    database = 'db',             
    charset = 'utf8'               
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)
username = input('请输入用户名:')
password = input('请输入密码:')
sql = "select * from userinfo where name = %s and password =%s" 
res = cursor.execute(sql,(username,password))                      # execute可以自动识别sql语句中的%s,它可以帮助你过滤特殊的字符,避免sql注入的问题
if res:
    print(cursor.fetchall())
else:
    print('账号或密码错误')

 

 

总结:

  1.sql注入,就是利用注释等具有特殊意义的符号,来完成的

  2.后续写sql语句时,不要手动去拼接关键性的数据,而是交由execute去拼接

 

 

 

python对mysql的增,改,删操作

import pymysql


conn = pymysql.connect(
    host = '127.0.0.1',          
    port = 3306,                   
    user = root,                   
    password = '',                 
    database = 'db',             
    charset = 'utf8'               
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)  
sql = "insert into user(name,password) values('wu','123') "    #插入,增
cursor.execute(sql)
conn.commit()   在新增时要写conn.commit()
import pymysql


conn = pymysql.connect(
    host = '127.0.0.1',          
    port = 3306,                   
    user = root,                   
    password = '',                 
    database = 'db',             
    charset = 'utf8'               
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)  
sql = "update user set name='qazqaz' where id = 1 "    #修改
cursor.execute(sql)
conn.commit()    #在修改时要写conn.commit()

import pymysql


conn = pymysql.connect(
    host = '127.0.0.1',          
    port = 3306,                   
    user = root,                   
    password = '',                 
    database = 'db',             
    charset = 'utf8'               
    )    
cursor = conn.cursor(pymsql.cursors.DictCursor)  
sql = "delete from user where id = 1 "    #删除
cursor.execute(sql)
conn.commit()    #在删除时要写conn.commit()

 

posted @ 2019-08-22 21:42  Key丶橙子哥  阅读(1028)  评论(0编辑  收藏  举报