zoukankan      html  css  js  c++  java
  • 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...')
  • 相关阅读:
    windows10更新导致中文乱码
    优化国际网站从一分钟到4~6秒
    修改elementUI组件自带的提示文字并支持国际化
    Python钉钉报警及Zabbix集成钉钉报警
    Go热门开源项目大全
    CentOS7基于ss5搭建Socks5代理服务器
    sass map !default 属性覆盖
    Linux下mv命令高级用法
    设置与查看Linux系统中的环境变量
    Linux下more命令高级用法
  • 原文地址:https://www.cnblogs.com/xuewei95/p/15116655.html
Copyright © 2011-2022 走看看