zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    nyoj--325--zb的生日(简单dp)
    nyoj--124--中位数(水题)
    nyoj--90--整数划分(母函数)
    nyoj--18--The Triangle(dp水题)
    CodeForces ---596B--Wilbur and Array(贪心模拟)
    nyoj--1023--还是回文(动态规划)
    poj--3984--迷宫问题(bfs+路径记录)
    Netty(4)Stream by codec(粘包与拆包)
    Netty(1-1)Discard
    Netty:option和childOption参数设置说明
  • 原文地址:https://www.cnblogs.com/chengzige/p/11397035.html
Copyright © 2011-2022 走看看