Sichere Möglichkeit, MySQL-Tabelleneinträge mithilfe des Wörterbuchs in Python zu aktualisieren (SQL-Injection verhindern)
P粉627427202
P粉627427202 2023-09-08 20:06:07
0
1
518

Ich schreibe eine Hilfsfunktion für meine Webanwendung, die die Datenbank basierend auf einigen Informationen aktualisiert, die von einer externen API erhalten wurden (keine Benutzereingaben). Ich habe den folgenden Code, aber er wird vom Bandit-Python-Paket als „unsicher“ markiert.

Idealerweise könnte ich eine Funktion so schreiben, dass die zu aktualisierenden Spalten fest codiert werden, aber ich denke, es sollte auch möglich sein, dies dynamisch zu tun.

Ist dies eine sichere Möglichkeit, eine Tabelle zu aktualisieren (keine SQL-Injection möglich)?

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粉627427202
P粉627427202

Antworte allen (1)
P粉926174288

您应该将列名放在反引号中,以防列名是SQL 保留关键字或包含空格、标点符号或国际字符。还要确保列名称中的反引号字符替换为两个反引号。

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

我更喜欢使用 f 字符串而不是 format()。

    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!