• MySql


    主要内容:

    • 1.pymysql的下载和使用
    • 2.excute() 中sql 注入
    • 3.cursor 
    • 4.增 删 改 操作
    • 5. 查

    1.pymysql 的下载和使用

    pymysql模块,该模块本质就是一个套接字客户端软件,通过 pymysql模块 我们就可以在python程序中操作数据库

    1.1pymysql 的下载

    #在pycharm的 Terminal 中输入指令
     pip install pymysql

    1.2 pymysql 模块的使用

    (1)在数据库中创建一张存用户账号密码的表

    mysql> select * from userinfo;
    +----+------+------+
    | id | name | pwd  |
    +----+------+------+
    |  1 | alex | 1234 |
    +----+------+------+

    (2)pycharm 代码

    #导入pymysql模块
    import pymysql
    username ,password= input ("请输入用户名"),input ("请输入密码")
    #连接数据库
    conn =pymysql.connect(
        host='127.0.0.1',     #这个是ip地址,此处填写的是本机的回环地址(也可以填localhost)
        user ='root',         #数据库用户名
        password='',          #数据库用户名密码
        database ='db10',     # 数据库名,该数据库中有存放账号密码的表
        port=3306,            #端口号 默认3306
        charset ='utf8'       #编码方式,和数据库编码方式一致
    )
    #创建游标,用来操作数据库语句
    cur = conn.cursor()
    #数据库语句 (注意此处的%s 需要加'')
    sql ="select * from userinfo where name='%s' and pwd ='%s'" % (username,password)
    #执行sql语句
    result =cur.execute(sql)
    #关闭光标
    cur.close()
    if result:
        print('登录成功')
    else:
        print("登录失败")

    2.excute() 中sql 注入

    2.1注入现象

    最后那一个空格,在一条sql语句中如果遇到
    select * from userinfo where username='alex' -- asadasdas' and pwd='' 则--之后的条件被注释掉了(注意--后面还有一个空格)
    
    #1、sql注入之:用户存在,绕过密码
    alex' -- 任意字符
    
    #2、sql注入之:用户不存在,绕过用户与密码
    xxx' or 1=1 -- 任意字符

    2.2 解决

    # 原来是我们对sql进行字符串拼接
    # sql="select * from userinfo where name='%s' and pwd='%s'" %(username,password)
    # result=cursor.execute(sql)
    
    #改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
     #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
    sql="select * from userinfo where name=%s and password=%s"
    #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
    #当execute中列表和密码是按列表方式传入
    result=cur.execute(sql,[user,pwd]) 
    #此时得到的结果是元祖
    
    sql="select * from userinfo where name=%(name)s and password=%(password)s" 
    result=cur.execute(sql,{"name":username,"password":pwd})
    #此时输出结果为字典形式

    3. cursor对象

    Cursor对象就是对数据库进行具体的操作了,比如增、删、改、查等等一系列操作都可以完成

    类型 描述
    Cursor 普通的游标对象,默认创建的游标对象
    SSCursor 不缓存游标,主要用于当操作需要返回大量数据的时候
    DictCursor 以字典的形式返回操作结果
    SSDictCursor 不缓存游标,将结果以字典的相识进行返回

    注:不缓存游标的特点是:根据需要获取行,不是将所有的数据都复制到缓冲区。这样做的好处是:客户端使用更少的内存,并且当网速慢时或者结果集非常大时,返回行的速度要快得多

     4.增 删 改 操作

     5.查

    #获取下一行数据,第一次为首行;
    etchone():
    #获取所有行数据源
    fetchall():
    #获取4行数据
    fetchmany(4):

    默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:

    #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  

    移动指针:

     # 相对当前位置移动
    cursor.scroll(1,mode='relative') 
    # 相对绝对位置移动
    cursor.scroll(2,mode='absolute') 
    #第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动
  • 相关阅读:
    JS事件委托学习(转)
    js 监听监键盘动作(转)
    JS操作JSON总结
    靶机练习-VulnHub-Toopo
    Web安全测试学习笔记
    Web安全测试学习笔记
    PentesterLab练习
    CTF-攻防世界-supersqli(sql注入)
    工具学习
    漏洞复现-ElasticSearch 命令执行漏洞(CVE-2014-3120)
  • 原文地址:https://www.cnblogs.com/wcx666/p/10009767.html
Copyright © 2020-2023  润新知