0: print('登陆成功')

但是,如果传入参数是:

input['id']='2or1=1'

你会发现,用户能够直接登录到系统中,因为原本sql语句的判断条件被or短路成为了永远正确的语句。
这里仅仅是举一个例子,事实上,sql注入的方式还有很多种,这里不深入介绍了。

总之,只要是通过用户输入数据来拼接sql语句,就必须在第一时间考虑如何避免SQL注入问题。

那么,如何防止SQL注入呢?

2.预防SQL注入–pymysql参数化语句

pymysql的execute支持参数化sql,通过占位符%s配合参数就可以实现sql注入问题的避免。

importpymysql

sql='SELECTcount(*)ascountFROMuserWHEREid=%sANDpassword=%s'
valus=[input['id'],input['password']]
cursor=dbclient.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql,values)
count=cursor.fetchone()
ifcountisnotNoneandcount['count']>0:
print('登陆成功')

这样参数化的方式,让mysql通过预处理的方式避免了sql注入的存在。

需要注意的是,不要因为参数是其他类型而换掉%s,pymysql的占位符并不是python的通用占位符。

同时,也不要因为参数是string就在%s两边加引号,mysql会自动去处理。

3.预防SQL注入–mysql存储过程

数据库存储过程是mysql的一种高级用法,但是一般来说,并不建议使用数据库的存储过程。

主要原因是:

但是,虽然不建议使用存储过程,但是毕竟可以依赖他实现各种跨语言的sql注入预防,在复杂的场景下还是有其使用价值的。(以后需要用再去详细学,这里只作简单介绍)

3.1.存储过程编写

delimiter\DROPPROCEDUREIFEXISTSproc_sql\CREATEPROCEDUREproc_sql(
innid1INT,
innid2INT,
incallsqlVARCHAR(255)
)
BEGIN
set@nid1=nid1;
set@nid2=nid2;
set@callsql=callsql;
PREPAREmyprodFROM@callsql;
--PREPAREprodFROM'select*fromtb2wherenid>?andnid

3.2.pymsql中调用

importpymysql

cursor=conn.cursor()
mysql="SELECT*FROMuserwherenid>?andnid

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。

热门推荐

免责声明:网站资源来源于网络,如有侵权,请及时联系删除。

Copyright © 2024 好资源导航网. All Rights Reserved.

蜀ICP备2021004611号-4 网站地图