python+Django 防止SQL注入的辦法

python+Django 防止SQL注入

先看看那種容易被注入的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中的,導入不要導入錯了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章