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.注入穴の修復
SQLではなくpymysqlパラメータ化クエリーを使用すると、脆弱性の注入、不正な文字のエスケープを回避できます.
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の日常開発における脆弱性の注入を防止する方法をまとめます.
パラメトリッククエリを使用して元の文を実行します.djangoなどのORM付きwebフレームワークを使用します.ORMコンポーネントsqlalchemy,peeweeを使用します.正規および文字列メソッドを使用して、単一引用符や注釈記号などの注入リスクを検出します(推奨しません).
参照リンク:
https://blog.dfen.xyz/2018/04/sql-injection.html?m=1
もっと多くの文章は私の個人ブログにアクセスすることができます:コード練習