cari

Rumah  >  Soal Jawab  >  teks badan

Cara selamat untuk mengemas kini entri jadual mysql menggunakan kamus dalam python (halang suntikan SQL)

Saya sedang menulis fungsi pembantu untuk aplikasi web saya yang mengemas kini pangkalan data berdasarkan beberapa maklumat yang diperoleh daripada API luaran (bukan input pengguna). Saya mempunyai kod berikut, tetapi ia ditandakan sebagai "tidak selamat" oleh pakej python Bandit.

Sebaik-baiknya saya boleh menulis fungsi dengan cara yang mengekodkan lajur untuk dikemas kini, tetapi saya fikir ia juga boleh dilakukan secara dinamik.

Adakah ini cara yang selamat untuk mengemas kini jadual (tiada suntikan SQL mungkin)?

import mysql.connector as database

def update_message_by_uid(uid: str, update_dict: dict) -> None:

    # Fetches the previous entry from the database using the unique identifier
    message_info_dict = get_message_by_uid(uid)

    # check that all the keys of the update dict are also in the original dict
    assert set(update_dict.keys()) <= set(
        message_info_dict.keys()
    ), "Some of the keys in the dictionary passed are not valid database columns"

    # We update the entry for all entries in the dictionary containing the updates
    statement = 'UPDATE messages SET {}  WHERE uid = %s'.format(", ".join('{}=%s'.format(k) for k in update_dict))


    # Concatenates the values of the dict with the unique identifier to pass it to the execution method as one variable
    data = list(update_dict.values()) + [uid]

    cursor.execute(statement, data)

P粉627427202P粉627427202453 hari yang lalu693

membalas semua(1)saya akan balas

  • P粉926174288

    P粉9261742882023-09-09 17:22:57

    Anda harus meletakkan nama lajur dalam tanda belakang sekiranya nama lajur ialah SQL reserved keyword atau mengandungi ruang, tanda baca atau aksara antarabangsa. Juga pastikan bahawa aksara backtick dalam nama lajur digantikan dengan dua backtick.

    assignments = ", ".join(f"`{k.replace('`', '``')}`=%s" for k in update_dict)
    statement = f"UPDATE messages SET {assignments}  WHERE uid = %s"

    Saya lebih suka menggunakan rentetan f daripada format().

    balas
    0
  • Batalbalas