Un moyen sûr de mettre à jour les entrées de la table MySQL à l'aide du dictionnaire en Python (empêcher l'injection SQL)
P粉627427202
P粉627427202 2023-09-08 20:06:07
0
1
604

J'écris une fonction d'assistance pour mon application Web qui met à jour la base de données en fonction de certaines informations obtenues à partir d'une API externe (et non d'une entrée utilisateur). J'ai le code suivant, mais il est marqué comme "dangereux" par le package Python Bandit.

Idéalement, je pourrais écrire une fonction de manière à coder en dur les colonnes à mettre à jour, mais je pense qu'il devrait également être possible de le faire de manière dynamique.

Est-ce un moyen sûr de mettre à jour une table (pas d'injection SQL possible) ?

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

répondre à tous(1)
P粉926174288

Vous devez mettre les noms de colonnes entre guillemets au cas où le nom de la colonne serait un mot-clé réservé SQL ou contiendrait des espaces, des signes de ponctuation ou des caractères internationaux. Assurez-vous également que les caractères backtick dans les noms de colonnes sont remplacés par deux backticks.

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

Je préfère utiliser f string au lieu de format().

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!