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
513

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 unmot-clé réservé SQLou 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!