Django中防止SQL注入的方法
總是使用Django自帶的數據庫API。它會根據你所使用的數據庫服務器(例如PostSQL或者MySQL)的轉換規則,自動轉義特殊的SQL參數。這被運用到了整個Django的數據庫API中,只有一些例外:
傳給 extra() 方法的 where 參數。 這個參數故意設計成可以接受原始的SQL。使用底層數據庫API的查詢。
## select提供簡單數據 # SELECT age, (age > 18) as is_adult FROM myapp_person; Person.objects.all().extra(select={'is_adult': "age > 18"}) # 加在select后面 ## where提供查詢條件 # SELECT * FROM myapp_person WHERE first||last ILIKE 'jeffrey%'; Person.objects.all().extra(where=["first||last ILIKE 'jeffrey%'"]) # 加一個where條件 ## table連接其它表 # SELECT * FROM myapp_book, myapp_person WHERE last = author_last Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面 ## params添參數 # !! 錯誤的方式 !! first_name = 'Joe' # 如果first_name中有SQL特定字符就會出現漏洞 Person.objects.all().extra(where=["first = '%s'" % first_name]) # 正確方式 Person.objects.all().extra(where=["first = '%s'"], params=[first_name])
python中sql中注入
from pymysql import * def main(): find_name = input("請輸入物品名稱:") # 創建Connection連接 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8') # 獲得Cursor對象 cs1 = conn.cursor() # # 非安全的方式 # # 輸入 " or 1=1 or " (雙引號也要輸入) # sql = 'select * from goods where name="%s"' % find_name # print("""sql===>%s<====""" % sql) # # 執行select語句,並返回受影響的行數:查詢所有數據 # count = cs1.execute(sql) # 安全的方式 # 構造參數列表 params = [find_name] # 執行select語句,並返回受影響的行數:查詢所有數據 count = cs1.execute('select * from goods where name=%s', params) # 注意: # 如果要是有多個參數,需要進行參數化 # 那么params = [數值1, 數值2....],此時sql語句中有多個%s即可 # 打印受影響的行數 print(count) # 獲取查詢的結果 # result = cs1.fetchone() result = cs1.fetchall() # 打印查詢的結果 print(result) # 關閉Cursor對象 cs1.close() # 關閉Connection對象 conn.close() if __name__ == '__main__': main()
請注意在cursor.execute() 的SQL語句中使用“%s”,而不要在SQL內直接添加參數。 如果你使用這項技術,數據庫基礎庫將會自動添加引號,同時在必要的情況下轉意你的參數。