简单的SQL注入实现-python

课堂小作业

使用navicat(也可以用其他的)数据库工具在db3数据库里简单的建一个账号密码表,插入数据,建表语句如下:

CREATE TABLE login (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL,
  password VARCHAR(50) NOT NULL
);

用python实现一个可以进行SQL注入的简单代码

import pymysql

# 存在SQL注入
# SQL注入语句 username:任意 password(万能密码):1' or 1=1 #
if __name__ == "__main__":
    # 连接数据库
    conn = pymysql.connect(host='localhost',
                           user='root', #自己的数据库账号
                           password='123456', #数据库密码
                           database='db3', #名字
                           charset='utf8')
    cur = conn.cursor()  # 生成游标对象
    try:
        username = input("please input username:")
        password = input("please input password:")
        # 使用拼接SQL语句
        sql = "select * from login where username='"+username+"'and password='"+password+"'"
        print(sql)
        cur.execute(sql)
        datas = cur.fetchone()
        if not datas:
            print('login fail!')
        else:
            print("login success!")
        conn.commit()  # 提交事务
    except Exception as e:
        conn.rollback()
        print('操作失败:', e)
    finally:
        cur.close()  # 关闭游标和数据库连接
        conn.close()

输入账号密码尝试登录看看是否正常:

接下来输入错误的账号密码看看运行结果,可以看到登入失败:

接下来进行SQL注入尝试登入,可以看到注入成功:

要防止SQL注入,就要避免使用拼接语句,修改如下:

import pymysql
# 不使用拼接语句
if __name__ == "__main__":
    # 连接数据库
    conn = pymysql.connect(host='localhost',
                           user='root',
                           password='123456',
                           database='db3',
                           charset='utf8')
    cur = conn.cursor()  # 生成游标对象
    try:
        username = input("please input username:")
        password = input("please input password:")
        params = (username,password)
        # 使用参数化查询
        sql = "select * from login where username= %s and password= %s"
        print(sql)
        cur.execute(sql,params)
        datas = cur.fetchone()
        if not datas:
            print('login fail!')
        else:
            print("login success!")
        conn.commit()  # 提交事务
    except Exception as e:
        conn.rollback()
        print('操作失败:', e)
    finally:
        cur.close()  # 关闭游标和数据库连接
        conn.close()

输入账号密码,可以看到登入成功:

进行SQL注入,此时登入失败:

总结:参数化查询将用户输入作为参数传递给SQL语句,而不是直接拼接到SQL语句中。这样可以确保用户输入被正确转义,防止恶意代码被执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值