45 votes

Caractères d'échappement en Python et sqlite

J'ai un script python qui lit les fichiers texte bruts des films dans une base de données sqlite.

J'utilise re.escape (title) pour ajouter des caractères d'échappement dans les chaînes pour les rendre db sûrs avant d'exécuter les insertions.

Pourquoi cela ne fonctionne-t-il pas:

 In [16]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='\'Allo\ \'Allo\!\"\ \(1982\)'")
--------------------------------------------------------------------------- OperationalError                       Traceback (most recent call last)

/home/rajat/Dropbox/amdb/<ipython console> in <module>()

OperationalError: near "Allo": syntax error
 

Pourtant, cela fonctionne (supprimé \ 'à deux endroits):

 In [17]: c.execute("UPDATE movies SET rating = '8.7' WHERE name='Allo\ Allo\!\"\ \(1982\)'") Out[17]: <sqlite3.Cursor object at 0x9666e90>
 

Je ne peux pas comprendre. Je ne peux pas non plus abandonner ces citations principales, car elles font en fait partie du titre du film. Je vous remercie.

104voto

Donal Fellows Points 56559

Vous le faites mal. Au sens propre. Vous devez utiliser des paramètres, comme ceci:

 c.execute("UPDATE movies SET rating = ? WHERE name = ?", (8.7, "'Allo 'Allo! (1982)"))
 

Comme ça, vous aurez pas besoin de faire une citation du tout et (si ces valeurs sont en provenance de toute personne non fiable) , vous serez 100% sûr (ici) des attaques par injection SQL aussi.

11voto

Alex Martelli Points 330805

J'utilise re.escape (title) pour ajouter des caractères d'échappement dans les chaînes pour les rendre db sûrs

Notez que re.escape rend une chaîne à nouveau sécurisée - rien à voir avec la sécurisation de db . Au contraire, comme le dit @Donal, ce dont vous avez besoin est le concept de substitution de paramètres de l'API Python DB - qui rend les choses "db sûres" selon vos besoins.

7voto

dan04 Points 33306

SQLite ne prend pas en charge les séquences d'échappement antislash. Les apostrophes dans les littéraux de chaîne sont indiquées en les doublant: '''Allo ''Allo! (1982)' .

Mais, comme l'a dit Donal, vous devriez utiliser des paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X