• (9)SQL的注入(致命的漏洞)


    用户登陆网站的时候进行账户验证输入特殊的格式和字符会触发一个漏洞,不需要密码直接登录成功

    import pymysql

    username = input('请输入账号: ')
    password = input('请输入密码: ')

    conn = pymysql.connect(host='localhost',user='root',password='',database='company',port=3306,charset='utf8',cursorclass=pymysql.cursors.DictCursor)

    cursor = conn.cursor()

    cursor.execute("select * from userinfo where name='%s'and password='%s'"%(username,password))
    res = cursor.fetchall()
    if res:
    print(res)
    else:
    print('账号密码错误')

    用户在输入账号的使用使用这种格式: 

    1、用户名+空格+ ' + 空格 + #, #知道用户名的情况下以这种格式进行登陆验证,密码随意填写,就会触发bug,用户的验证通过,并不需要密码

    2、任意字母 + 空格 + ' + or + 空格 + 1=1 + 空格 + #  #这种格式不需要账户和密码,能够直接通过数据库验证

    PS:注入的原理就是在用户名的后面加 #,这样值在传入指令的时候后面跟了一个 #,#后面所有的代码都被注释掉,这样值模仿判定代码就会生效

    解决注入漏洞的办法

    import pymysql

    username = input('请输入账号: ')
    password = input('请输入密码: ')

    conn = pymysql.connect(host='localhost',user='root',password='',database='company',port=3306,charset='utf8',cursorclass=pymysql.cursors.DictCursor)

    cursor = conn.cursor()

    '''避免注入,将指令放入变量中'''
    sql = "select * from userinfo where name=%sand password=%s"

    '''将执行sql语句的时候将值以元组的形式传入,python就会自动转义,去掉#号'''
    cursor.execute(sql,(username,password))

    res = cursor.fetchall()
    if res:
    print(res)
    else:
    print('账号密码错误')

    不单单是登陆验证,在插入数据的时候也不要用这种格式 

    "select * from userinfo where name='%s'and password='%s'"%(username,password)

    登陆和插入的时候都要以这种格式(安全格式)

    sql = "select * from userinfo where name=%sand password=%s"

    cursor.execute(sql,(username,password))
  • 相关阅读:
    经典音乐插曲推荐![附地址]
    广播电台常用51首背景音乐——绝对经典
    酒吧..夜店常用歌曲~潮人必备音乐噢~【附下载地址】
    ASP与ASP.NET互通COOKIES的一点经验
    linux进程状态浅析
    常用的酒吧经典乐曲106首
    呼和浩特电视台媒资管理系统的设计与分析
    不再为DataGrid生成的表格的单无格中的内容过长、自动折行、表格撑开等问题而烦恼
    Linux shell脚本全面学习
    ASP.NET文件管理显示信息
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10309902.html
Copyright © 2020-2023  润新知