pymysql如何解决sql注入问题深入讲解
1.SQL注入
SQL注入是非常常见的一种网络攻击方式,主要是通过参数来让mysql执行sql语句时进行预期之外的操作。
即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数据库。
产生原因:SQL语句使用了动态拼接的方式。
例如,下面这段代码通过获取用户信息来校验用户权限:
importpymysql sql=" '="" cursor="dbclient.cursor(pymysql.cursors.DictCursor)" cursor.execute(sql)="" count="cursor.fetchone()" ifcountisnotnoneandcount['count']="">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语句语法相差太大,增加维护成本
- 存储过程在各数据库间不通用且差别较大,给数据库的移植和扩展带来困难
- 编写困难,数据库脚本语言使用起来还是很不方便的,包括很多数据结构的缺失,让很多事情做起来很困难
- 调试困难,虽然有一些功能强大的IDE提供了数据库存储过程的调试功能,但是通常你需要同时在数据库层面上和业务中同时进行调试,两处调试极为不便
- 业务耦合,编写存储过程通常是需要在其中放入部分业务逻辑,这使得业务分散在数据层,业务层与数据层的耦合对于项目维护和扩展都会带来极大地不便。
但是,虽然不建议使用存储过程,但是毕竟可以依赖他实现各种跨语言的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>?andnid3.2.pymsql中调用
importpymysql cursor=conn.cursor() mysql="SELECT*FROMuserwherenid>?andnid总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
热门推荐
- 返回顶部
- 3162201930
- czq8825@qq.com