经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
python+Django实现防止SQL注入的办法
来源:jb51  时间:2019/10/31 12:50:11  对本文有异议

先看看那种容易被注入的SQL

  1. id = 11001
  2. sql = """
  3. SELECT
  4. id,
  5. name,
  6. age
  7. FROM
  8. student
  9. WHERE
  10. id = """+id+"""
  11. """
  12. cursor = connection.cursor()
  13. try:
  14. cursor.execute(sql)
  15. result = cursor.fetchall()
  16. for result1 in result:
  17. // 代码块
  18. pass
  19. finally:
  20. cursor.close()

一般来说写SQL语句在程序中,若有where条件一般都可能会去直接拼接,到那时这种方式容易被SQL注入,首先说明下什么是SQL的注入,简单来说就是你写的SQL被别人在页面上拼接了SQL。比如拼接1=1这种条件,如果登录接口被注入1=1那么就可以随意进入你的程序了。所以才要防止SQL的注入。

下面再来看看防止SQL的注入

  1. id = 11001
  2. params = []
  3. sql = """
  4. SELECT
  5. id,
  6. name,
  7. age
  8. FROM
  9. student
  10. WHERE
  11. id = %s
  12. """
  13. params.append(id)
  14. cursor = connection.cursor()
  15. try:
  16. cursor.execute(sql, params)
  17. result = cursor.fetchall()
  18. for result1 in result:
  19. // 代码块
  20. pass
  21. finally:
  22. cursor.close()

我们把直接拼接的条件变量放入集合再把集合带入执行SQL的方法,就可以避免被注入的风险,在SQL的条件中使用%s进行站位,要注意的是这个%s是有顺序的,比如说上面这个SQL后面在跟一个条件name=%s那么下面的params集合也要多加一个元素params.append(name)这个时候name是在id后面的在集合中。这样可以一一对应,但如果要是把params.append(name)写在了params.append(id)前面SQL执行就会出现id=name and name = id 的条件就乱了,甚至还会报错。
使用connection完毕之后一定要记得close,connection是django.db中的,导入不要导入错了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号