• pymysql 模块的用法


    介绍mysql模块
    首先让py和数据库连接,通过这个模块建立连接
    pip install pymysql
    '''
    import pymysql
    conn = (host ='localhost',#服务器ip
    port =3306,#服务器端口号
    user ='root',#服务器用户名
    pwd =None,#服务器密码
    database ='db1',服务器中的一个库
    charset ='uf8'
    )#建立连接

    cursor= conn.cursor()#建立游标,返回的结果集是元组形式的数据
    #cursor = conn.cursor(pymysql.cursors.DictCursor)#建立游标,结果集是字典形式的数据

    执行sql
    sql='select * from t1'#(t1 是db2库中已经存在的table)
    借助execute来注入
    res =cursor.execute(sql) #拼接字符串
    print(res)
    cursor.close() #关闭游标
    conn.close() # 关闭连接
    '''


    由于execute注入的机制和数据库sql命令的机制
    会出现不少bug,如--,or 这些字符的出现

    举个例子,db2中有userinfo表 其中内含字段id ,name,pwd 查询时会出现一些漏洞
    userinfo表中内含(1,oewn1,123)(2,owen2,456),(3,owen3,789)三条数据
    import pymysql
    user=input('用户名: ').strip()
    pwd=input('密码: ').strip()

    #链接
    conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
    #游标
    cursor=conn.cursor()
    #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


    #执行sql语句
    sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
    print(sql)
    res=cursor.execute(sql)
    print(res)

    cursor.close()
    conn.close()

    if res:
    print('登录成功')
    else:
    print('登录失败')

    #1、sql注入之:用户存在,绕过密码
    owen1" -- 任意字符

    #2、sql注入之:用户不存在,绕过用户与密码
    xxx" or 1=1 -- 任意字符

    一开始是字符串拼接,我们让这个模块帮我们拼接
    #改写为(execute帮我们做字符串拼接,我们无需再为%s加引号了)
    sql="select * from userinfo where name=%s and password=%s" #!!!
    res=cursor.execute(sql,[name,pwd])

    谈谈CRUD(增删改查)
    sql='insert into userinfo(name,password) values("root","123456");'
    res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
    print(res)
    但这只是在内存中做了创建,并没有写到磁盘里面去,增删改都需要提交commit
    我们需要在conn.close()之前conn.commit()提交一下方可以写到盘里.

    在查的时候并不需要提交commit,用的是fetchone,fetchmany,fetchall,
    # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
    # cursor.scroll(3,mode='relative') # 相对当前位置移动
    #scroll作用指向游标,移动游标位置
    print(res1=cursor.fetchone())
    print(res2=cursor.fetchone())
    承蒙关照
  • 相关阅读:
    Codeforces Round #644 (Div. 3) A~G
    西安邮电大学第五届ACM-ICPC校赛(同步赛) B(拓扑排序)
    Codeforces Round #642 (Div. 3)A~D
    Codeforces Round #641 (Div. 2)A~D
    Codeforces Round #634 (Div. 3)A~E
    Educational Codeforces Round 85 (Rated for Div. 2)ABCD
    Codeforces Round #631 (Div. 2) ABD
    Codeforces Round #629 (Div. 3) E
    Educational Codeforces Round 84 (Rated for Div. 2) E
    yp训练赛3/21
  • 原文地址:https://www.cnblogs.com/guanlei/p/10881926.html
Copyright © 2020-2023  润新知