SQL注入例項:避免後端SQL語句拼接操作
阿新 • • 發佈:2019-02-02
1 例項-後端邏輯
以下是基於pymysql的一個例子:
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='mysql', db='user_table', charset='utf-8')
cursor = conn.cursor()
def query_key(key):
sql = "SELECT name FROM user_info where key_id='{}'".format(key)
cursor.execute(sql)
fet = cursor.fetchone()
if not fet:
result = "Not Found"
else:
result = fet[0]
print(result)
上面的程式會在使用者輸入key的時候,將key拼接到SQL語句進行查詢。
2 測試漏洞
2.1 測試正常使用者行為
key = 10
query_key(key)
# SELECT name FROM user_info where key_id='10'
> Alan
正常查詢會正常返回相應id的姓名
2.2 測試注入攻擊者行為
key = "' or '1'='1"
query_key(key)
# sql = SELECT name FROM user_info where key_id='' or '1'='1'
> Lee
此時由於注入漏洞sql會查到所有資料,result則會顯示第一條資料
2.3 測試注入攻擊者行為-提取所有資料
key = "' or '1'='1 limit 1,1"
query_key(key)
# sql = SELECT name FROM user_info where key_id='' or '1'='1' limit 1,1
> Lee
key = "' or '1'='1 limit 2,2"
query_key(key)
# sql = SELECT name FROM user_info where key_id='' or '1'='1' limit 2,1
> Hank
此時攻擊者如果對注入語句稍作修改,寫指令碼遍歷資料庫,會有資料全部洩露的風險。
3. 修復注入漏洞
使用pymysql引數化查詢而非SQL拼接的方式,可以避免注入漏洞,轉義非法字元
def query_key(key):
sql = "SELECT name FROM user_info where key_id=%s"
cursor.execute(sql, [key])
fet = cursor.fetchone()
if not fet:
result = "Not Found"
else:
result = fet[0]
print(result)
下面總結一下python web日常開發中防止注入漏洞的方法:
使用引數化查詢執行原生語句;
使用帶有ORM的web框架,比如django;
使用ORM元件sqlalchemy,peewee;
使用正則和字串方法檢測注入風險,比如單引號和註釋符號等(不推薦)。
參考連結:
更多文章可以訪問我的個人部落格:碼練