python+Django实现防止SQL注入的办法

yipeiwu_com6年前Python基础

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

 id = 11001
    sql = """
    SELECT
      id,
      name,
      age
    FROM
      student
    WHERE
      id = """+id+""" 
    """
    cursor = connection.cursor()
    try:
      cursor.execute(sql)
      result = cursor.fetchall()
      for result1 in result:
        // 代码块
        pass
    finally:
      cursor.close()
 

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

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

 id = 11001
 params = []
    sql = """
    SELECT
      id,
      name,
      age
    FROM
      student
    WHERE
      id = %s
    """
    params.append(id)
    cursor = connection.cursor()
    try:
      cursor.execute(sql, params)
      result = cursor.fetchall()
      for result1 in result:
        // 代码块
        pass
    finally:
      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中的,导入不要导入错了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python删除字符串中指定字符的方法

最近开始学机器学习,学习分析垃圾邮件,其中有一部分是要求去除一段字符中的标点符号,查了一下,网上的大多很复杂例如这样 import re temp = "司法局让我和户 1 5....

Python中的元组介绍

Python中的元组介绍

1.元组的创建 元组(tuple):元组本身是不可变数据类型,没有增删改查 元组内可以存储任意数据类型 t = (1,2.3,True,'star') ##例如这里面有数字,波尔...

Python实现数据结构线性链表(单链表)算法示例

Python实现数据结构线性链表(单链表)算法示例

本文实例讲述了Python实现数据结构线性链表(单链表)算法。分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码。 #...

详解python如何调用C/C++底层库与互相传值

前言 开发环境: Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator编译而已,并没有使用QT的任何库) Python调用C/C++...

pandas通过字典生成dataframe的方法步骤

1、将一个字典输入: 该字典必须满足:value是一个list类型的元素,且每一个key对应的value长度都相同: (以该字典的key为columns) >>>...