SQL注入

SQL注入攻擊指的是經過構建特殊的輸入做爲參數傳入Web應用程序,而這些輸入大都是SQL語法裏的一些組合,經過執行SQL語句進而執行攻擊者所要的操做,其主要緣由是程序沒有細緻地過濾用戶輸入的數據,導致非法數據侵入系統。python

根據相關技術原理,SQL注入能夠分爲平臺層注入和代碼層注入。前者由不安全的數據庫配置或數據庫平臺的漏洞所致;後者主要是因爲程序員對輸入未進行細緻地過濾,從而執行了非法的數據查詢。基於此,SQL注入的產生緣由一般表如今如下幾方面:①不當的類型處理;②不安全的數據庫配置;③不合理的查詢集處理;④不當的錯誤處理;⑤轉義字符處理不合適;⑥多個提交處理不當。mysql

SQL注入示例

實現需求,首先用戶輸入的用戶名和密碼,而後利用python模塊鏈接數據庫,查詢到相關的用戶信息。程序員

import pymysql

username = input('username >>>')
password = input('password >>>')
sql = "select username,password,email from tab1 where username = '%s' and password = '%s'" % (username,password)

conn = pymysql.connect(host='172.30.100.111', user='admin',password='123',database='python',charset='utf8')
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql)
data = cursor.fetchall()
print(data)

cursor.close()
conn.close()

以上代碼能夠實現所需功能正則表達式

在不須要任何的用戶信息狀況下也能夠獲取到內容,在username中輸入' or 1=1 -- 。sql

防止SQL注入

1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。數據庫

2.永遠不要使用動態拼裝sql,能夠使用參數化的sql或者直接使用存儲過程進行數據查詢存取。安全

3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。fetch

4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。加密

 上述SQL注入是利用雙"-"的特殊含義實現的,因此要對這種特殊字符進行處理。pymsql模塊中已進行了處理,在執行sql語句時,使用pymysql參數形式則可避免這種SQL注入。spa

import pymysql

username = input('username >>>')
password = input('password >>>')
sql = "select username,password,email from tab1 where username = %s and password = %s"  #不須要對內容加雙引號

conn = pymysql.connect(host='172.30.100.111', user='admin',password='123',database='python',charset='utf8')
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute(sql, args=(username,password))  #傳入參數
data = cursor.fetchall()
print(data)

cursor.close()
conn.close()

正常輸入結果

SQL注入結果,不會拿到內容

相關文章
相關標籤/搜索