1. 程式人生 > >SQL注入例項:避免後端SQL語句拼接操作

SQL注入例項:避免後端SQL語句拼接操作

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;
使用正則和字串方法檢測注入風險,比如單引號和註釋符號等(不推薦)。

參考連結:

更多文章可以訪問我的個人部落格:碼練