一:場景、示範
場景:查詢等拼接SQL和參數的問題,部落客為了示範,這裡寫一個有注入風險的接口,請勿模仿
class PostMan(View):
def get(self, request):
aa = request.GET.get('aa')
with connections['default'].cursor() as cursor:
sql = 'select * from sys_dict where pid = %s'%(aa)
cursor.execute(sql)
result = cursor.fetchall()
print(result)
return api_response(code=200,msg='aaa',data=result)
二:注入測試,這裡采用sqlmap檢測(通過postman等傳入" or 1=1 or " 也能看到效果)。
- sqlmap安裝及測試:github 下載下傳安裝包,解壓,進入sqlmap.py同級目錄,輸入以下指令測試
python sqlmap.py -hh
2. 注入檢測,-u 後跟的是視圖對應的接口位址
- 注入結果檢視,終端檢視輸出資訊或根據日志中的output位置 檢視相應日志,如圖
危害極大,還可以查詢所有表,庫,dump資料等,不再贅述,指令可以參考這篇部落格sqlmap常見指令
二:Django中sql注入解決方案,主要以下四種:
- 參數化查詢,文法如下
sql = '''select * from shixiang_table where id= "%s" limit 10'''
cursor.execute(sql, [pk])
print(data_count)
-
使用ORM元件,flask的sqlalchemy,django的orm
使用orm filter等進行查詢操作
- 資料庫最小權限原則,滿足業務需求的最小權限,如隻讀賬号等
-
危險字元過濾
主要過濾兩類字元:(1)一些SQL中的标點符号,如@,*以及單引号等等;(2)過濾資料庫關鍵字insert、delete from、drop table、truncate、mid、delete、update、truncate、declare、master、script、exec、net user、drop等關鍵字或者關鍵詞。