sql注入

对于在输入用户名密码等需要用户自行输入内容并在mysql数据库中查询的语句,sql注入是一种常见的被攻击方式。

#数据表场景
create table userinfo(id int primary key auto_increment,user_name char(10),password char(10));

insert into userinfo(user_name,password) values("gaga","123"),("mb","234");
#模拟用户登录场景
import pymysql

conn = pymysql.connect(
    host = "127.0.0.1",
    port = 3306,
    user = "root",
    password="123",
    database="test",
    charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)

while 1:
    user_name_input = input("请输入用户名:")
    password_input = input("请输入密码:")

    sql = "select * from userinfo where user_name = '%s' and password = '%s';"%(user_name_input,password_input)

    ret = cursor.execute(sql)

    if ret:
        print("登陆成功")
    else:
        print("用户名或密码错误")

这样就模拟出了一个登录场景
此时如果知道某一个用户名不知道密码
输入账户名时输入gaga’;-- (注意有个空格)密码随便输入一个,就可以登陆成功。
这是因为输入gaga’,-- 给sql语句拼凑出了
“select * from userinfo where user_name = ‘gaga’;-- and password = 3213213”
这样的字符串,在实际执行过程中会执行
select * from userinfo where user_name = ‘gaga’;
后面的都算注释,所以随便一个密码都可以登录

如果连账户也不知道,在用户名位置输入dsad’ or 1=1;–
密码也随便输入一个,也可以登陆成功。
这是因为输入dsad’ or 1=1;-- 给sql语句拼凑出了
“select * from userinfo where user_name = ‘dsad’ or 1=1;-- and password = 3213213”


解决

一般的解决方式是限制输入内容,利用正则表达式等方法不允许用户输入特殊符号,或者自动去掉特殊符号。

pymysql中的解决办法是自动去掉特殊符号

import pymysql

conn = pymysql.connect(
    host = "127.0.0.1",
    port = 3306,
    user = "root",
    password="123",
    database="test",
    charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)

import pymysql

conn = pymysql.connect(
    host = "127.0.0.1",
    port = 3306,
    user = "root",
    password="123",
    database="test",
    charset="utf8"
)
cursor = conn.cursor(pymysql.cursors.DictCursor)

while 1:
    user_name_input = input("请输入用户名:")
    password_input = input("请输入密码:")

    sql = "select * from userinfo where user_name = %s and password = %s;"
    # "select * from userinfo whereuser_name = 'gaga';--
    ret = cursor.execute(sql,[user_name_input,password_input])

    if ret:
        print("登陆成功")
    else:
        print("用户名或密码错误")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值