SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
例如当我们想查询姓名为孙权的有关信息
方法一:静态查询
def login1():
con=pymysql.connect(host='localhost',port=3306,user='root',password='admin',charset='utf8',db='sxt')
coursor=con.cursor()
# sql='select * from table1 where name="孙权" and psw="123";'
sql='select * from table1 where name="孙权" and 1=1'#psw="1234";'
coursor.execute(sql)
rs=coursor.fetchone()
print(rs)
coursor.close()
con.close()
我们可以直接通过name="孙权" and psw="123"来进行判断就可以获取。但攻击者也可以通过将姓名位置输入"孙权" and 1=1'#将后面的密码注释掉,使得密码失去其保护隐私的作用,而获得相关的信息。
方法二:动态查询
def login2(name,psw):
con=pymysql.connect(host='localhost',port=3306,user='root',password='admin',charset='utf8',db='sxt')
coursor=con.cursor()
# sql='select * from table1 where name="'+name+'" and psw="'+psw+'";'
sql=f'select * from table1 where name="{name}" and psw="{psw}";'
coursor.execute(sql)
rs=coursor.fetchone()
print(rs)
coursor.close()
con.close()
我们将name和psw的输入位置用'+name+'和'+psw+'或者{name}和{psw}来替代,通过函数传入有关的参数变量。这样可以通过函数动态查询有关的信息,然而SQL的注入查询漏洞仍然存在。
方法三:占位查询法
def login3(arg):
con=pymysql.connect(host='localhost',port=3306,user='root',password='admin',charset='utf8',db='sxt')
coursor=con.cursor()
sql='select * from table1 where name=%s and psw=%s;'
coursor.execute(sql,arg)
rs=coursor.fetchone()
print(rs)
coursor.close()
con.close()
通过%s占位name和psw的输入位置,可以预防注入查询的漏洞。