Échapper aux chars en Python et en sqlite

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

j'utilise ré.escape (title) pour ajouter des barres d'échappement dans les chaînes pour les rendre db sûres avant d'exécuter les inserts.

Pourquoi n'est-ce 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é ' en 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 le comprendre. Je ne peux pas non plus laisser tomber ces citations parce qu'elles font partie du titre du film. Remercier.

38
demandé sur lesmana 2010-07-10 20:41:38

4 réponses

Vous le faites mal. Littéralement. Vous devriez être à l'aide de paramètres, comme ceci:

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

Comme ça, vous n'aurez pas besoin de faire en citant à tous et (si ces valeurs viennent de n'importe qui non digne de confiance) vous serez 100% sûr (ici) des attaques D'injection SQL aussi.

91
répondu Donal Fellows 2010-07-10 16:48:42

j'utilise ré.escape(titre) pour ajouter échapper se déchire dans les cordes pour les faire db sûr

Notez que re.escape fait une chaîne re-ondes, rien à voir avec le fait de faire ça db coffre-fort. Plutôt, comme @Donal le dit, ce dont vous avez besoin est le paramètre de substitution concept de L'API Python DB -- rend les choses "db Sécuritaire" comme vous avez besoin.

10
répondu Alex Martelli 2010-07-10 17:08:09

SQLite ne supporte pas les séquences d'évasion par backslash. Les Apostrophes dans la littérature des cordes sont indiquées en les doublant: '''Allo ''Allo! (1982)'.

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

5
répondu dan04 2010-07-13 05:47:14

j'ai un conseil simple que vous pourriez utiliser pour gérer ce problème: Lorsque votre chaîne de déclaration SQL a une seule citation:', alors vous pouvez utiliser une double citation pour joindre votre chaîne de déclaration. Et quand votre chaîne de déclaration SQL a des guillemets doubles:", alors vous pouvez utiliser un guillemet simple: "pour enfermer votre chaîne de déclaration. E. g.

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

Ou

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

Cette solution fonctionne pour moi dans l'environnement Python.

-3
répondu Clock ZHONG 2016-08-10 08:23:57