2010-01-02 3 views
0

Je voudrais un regex qui ferait ceci:Regex pour doubler les guillemets simples dans la chaîne

VALUES('Hit 'n Run') 

dans

VALUES('Hit ''n Run') 

Est-ce possible?

+6

pour éviter l'aide regex échapper correctement SQL dynamique? mauvaise idée –

+0

Alors répondez et dites-lui où trouver une routine pour ce travail? – bmargulies

+0

Comment saurais-je quelle apostrophe est l'apostrophe de terminaison? Puis-je compter sur ('et') étant les modèles de début et de fin? (En connaissant SQL, je ne peux généralement pas en général mais c'est votre code) – slebetman

Répondre

4

Non, ce n'est pas vraiment possible. Si vous avez VALUES('Hit 'n Run'), vous avez déjà un mélange invalide d'apostrophes de délimitation et d'apostrophes littérales. Le traitement de chaîne est comme mélanger le sucre et le sel: une fois que vous avez mélangé des contextes sans s'échapper correctement, il n'y a aucun moyen de les séparer.

Si vous tentez de sauver des données brisées, vous pouvez essayer quelque chose comme (?<!\()'(?!\)) pour faire correspondre des apostrophes qui n'ont pas de crochet à côté d'eux. C'est une tactique faible et facilement trompée, mais pour des données simples, cela peut fonctionner.

Si vous mettez ensemble des requêtes SQL dynamiques vous devez échapper à la 'avant vous le mettez dans la chaîne de requête, soit à l'aide d'une simple chaîne de remplacement ' avec '' si vous êtes sûr que est la seule échapper à votre SGBD nécessite, ou - bien mieux - en utilisant une fonction SQL-string-literal-escape dédiée à votre SGBD. Tout dépend de la plate-forme (langage, SGBD) dont vous parlez.

+0

Je me suis dit, mais j'ai pensé que je vérifierais d'abord. J'ai beaucoup de chaînes sql qui ne sont pas échappées et toutes sont envoyées à une méthode "execute". Donc j'ai pensé que je pourrais gagner du temps en échappant juste au paramètre. Eh bien, rien à faire alors. – ErikTJ

+1

Ou * beaucoup plus * à faire selon la façon dont vous le regardez. Je ne suis pas sûr de la langue/cadre que vous utilisez, mais refactoriser ce code pour utiliser des requêtes paramétrées peut en valoir la peine. – Josh

+0

Les méthodes qui génèrent la requête prennent un objet en paramètre et en extraient des données. Rien à faire alors, je ne voulais rien faire d'autre que d'échapper à chaque méthode. – ErikTJ

2

Tout modèle qui pourrait être exprimé en RegEx pourrait alors être exploité pour créer les problèmes d'injection SQL que vous essayez d'éviter.

Exemple d'entrée méchant:

VALUES(');DELETE * FROM customer;SELECT ' 
+0

En fait, je n'évite pas ça. C'est une application privée pour un usage domestique. Donc le seul quelqu'un saboterait en faisant cela lui-même. – ErikTJ

+0

* Le Bicentennial Man * était un bon film, mais vous pouvez vraiment utiliser 'I' et 'moi' en ligne. :) –

Questions connexes