Maison  >  Article  >  développement back-end  >  Injection SQL dans la requête duckdb sur la trame de données pandas

Injection SQL dans la requête duckdb sur la trame de données pandas

WBOY
WBOYavant
2024-02-09 23:57:031268parcourir

pandas 数据帧上的 duckdb 查询中的 SQL 注入

Contenu de la question

Dans un projet, j'utilise duckdb pour effectuer quelques requêtes sur une trame de données. Pour l'une des requêtes, je dois ajouter une entrée utilisateur à la requête. C'est pourquoi je veux savoir si l'injection SQL est possible dans ce cas. Un utilisateur peut-il endommager une application ou un système via une entrée ? Si oui, comment puis-je empêcher que cela se produise ? Il semble que duckdb n'ait pas d'instruction préparée pour les requêtes de trames de données.

J'ai regardé dans la documentation (https://duckdb.org/docs/api/python/overview.html) mais je n'ai rien trouvé d'utile. La méthode duckdb.execute(query,parameters) semble fonctionner uniquement avec des bases de données avec de vraies connexions SQL, pas des dataframes.

Il y a une autre question sur stackoverflow à propos de ce sujet (syntaxe pour duckdb > python sql avec variable de paramètre), mais la réponse ne fonctionne que pour les connexions SQL réelles, et la version avec des chaînes f me semble dangereuse.

Voici un petit exemple de code pour illustrer ce que je veux dire :

import duckdb
import pandas as pd

df_data = pd.DataFrame({'id': [1, 2, 3, 4], 'student': ['student_a', 'student_a', 'student_b', 'student_c']})
    
user_input = 3  # fetch some user_input here
    
# How to prevent sql-injection, if its even possible in this case?
result = duckdb.query("SELECT * FROM df_data WHERE id={}".format(user_input))

Alors, comment allez-vous résoudre ce problème ? L’injection SQL est-elle possible ? Merci pour votre aide et si vous avez besoin de plus d'informations, n'hésitez pas à demander plus de détails !

EDIT : Correction d'une erreur de syntaxe dans le code


Bonne réponse


On dirait que c'est possible :

>>> duckdb.execute("""SELECT * FROM df_data WHERE id=?""", (user_input,)).df()

   id    student
0   3  student_b

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer