• sql注入


    一  sql注入

    原理:其实就是利用sqld的注释来骗过数据库去操作数据库

    --  是sql的注释,语法为:--  sql语句

    1.1一个简单的登陆验证页面来验证用户名和用户密码

    import pymysql
    user=input('用户名: ').strip()
    pwd=input('密码: ').strip()
    
    #链接
    conn=pymysql.connect(host='localhost',user='root',password='123456',database='test',charset='utf8')
    #游标
    cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
    #配置结果集为字典形式
    #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    
    #执行sql语句
    sql='select * from user where username="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
    print(sql)
    res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
    print(res)
    
    cursor.close()
    conn.close()
    
    if res:
        print('登录成功')
    else:
        print('登录失败')

    1.2sql注入演示

    假如我的用户名存在的,不知道密码的情况下情况:

     用户名与密码都不知道的情况下:

    为什么能登陆成功?

    #用户存在,绕过密码
    select * from user where username="lqz" -- lqz zhuru" and password="123"
    
    #用户不存在,直接绕过:
    select * from user where username="liuqz" or 1=1 -- lqz zhuru" and password="123"
    
    #-- 是注释掉后面的sql,有什么也不会执行
    #  or 1=1 永远成立
    #这样就绕过了用户名密码验证,就是我们常说的sql注入
    
    解释

    解决方案:

    # 原来是我们对sql进行字符串拼接
    sql="select * from user where username='%s' and password='%s'" %(user,pwd)print(sql)res=cursor.execute(sql)
    
    # 改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
    sql = "select * from user where usernamne=%s and password=%s"  
    res = cursor.execute(sql, [user, pwd])  
    # pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
    # !!!注意%s需要去掉引号,因为pymysql会自动为我们加上
  • 相关阅读:
    Linux Shell入门
    Linux系统结构
    Ubuntu bond 配置
    VXLAN概述
    lsof
    入驻博客园,希望可以跟大家一起讨论,一起学习和进步。
    版本管理工具小乌龟TortoiseGit的安装和使用(2)
    版本管理工具小乌龟TortoiseGit的安装和使用(1)
    定义变量时未初始化赋值的问题
    BlackBerry 9900刷机
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/10206997.html
Copyright © 2020-2023  润新知