zoukankan      html  css  js  c++  java
  • 8.22MySQL(五)pymysql模块、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了

  • 相关阅读:
    BZOJ 3261 最大异或和(可持久化Trie)
    模板 普通平衡树
    HDU4825 Xor Sum(贪心+Trie树)
    二维LIS(CDQ分治)
    IOIOI卡片占卜(Atcoder-IOIOI カード占い)(最短路)
    USACO 2009 Dec cow toll paths 过路费-floyd
    [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
    lightoj 1038 Race to 1 Again 期望
    lightoj 1030 Discovering Gold 期望
    lightoj 1027 A Dangerous Maze 期望
  • 原文地址:https://www.cnblogs.com/francis1/p/11396619.html
Copyright © 2011-2022 走看看