8768 sujets

Développement web côté serveur, CMS

Bonjour,

Au travail, je suis chargée de réparer les bugs d'une application web que je n'ai pas conçus, développée avec ExtJs pour préciser.

Mon bug d'aujourd'hui : quand du texte avec apostrophe est enregistré en BDD, les apostrophes doublent.

Normalement quand on enregistre du texte avec apostrophe en bdd on doit faire ça pour éviter les erreurs sql :

$v = str_replace("'", "''", $v);


Cependant c'est cette ligne qui fait que les apostrophes doublent, quand j’enlève cette ligne sa marche nickel !

Le php exécute ensuite une procédure stockée SQL Server, voici l'extrait qui traite les données de type texte :

begin transaction
-- Astuce pour récupérer une donnée text : créer une table temporaire
create table #ttTexte (Id int,Texte text)
insert into #ttTexte (Id,Texte) select 1,@sval
set @PDef = N'@pDate datetime'
set @SQL = 'update ' + @Col_Table_Nom + ' set ' + @Col_Colon_Nom +
'=Texte from #ttTexte WHERE Id = 1 and IdDate = @pDate '
execute sp_executesql @SQL, @PDef, @pDate = @idDate
drop table #ttTexte
end

Je pense que c'est cette partie de code qui empêche qu'une apostrophe vienne causé des erreurs SQL.

Ma question est... pourquoi ? Le fait de mettre le texte dans une table temporaire avant l'insertion empêche les erreurs SQL dus aux apostrophes ?

Je ne comprend pas, quelqu'un pourrait-il m'expliquer ?

Après quelqu'un va me dire, "mais osef tant que sa marche!" Mais non.

J'aime bien comprendre comment ça marche et surtout apprendre Smiley smile

Merci d'avance !
A première vue, le code SQL posté a l'air assez crétin et probablement simplifiable (ça me paraît bizarre de créer des tables temporaires à chaque insertion), mais bon, c'est pas le sujet; je ne suis pas un expert en MSSQL donc je ne saurais en dire plus, c'est juste un apriori.

Pour pouvoir t'aider, il faudrait en fait que tu postes le code php qui envoie la requête au serveur, pas le code SQL lui-même. Qu'est-ce que tu utilises ? PDO avec des requêtes préparées ? PDO tout simple ? une ancienne API équivalente à mysql ou mysqli ? Selon ta réponse, les mesures de sécurité à appliquer à l'entrée pourraient ne pas être pareilles.
Bonjour,

Je rejoins l'avis de QuentinC, je ne vois pas bien l'intérêt de faire un insert dans une table temporaire surtout si c'est juste pour un soucis d'apostrophe.

Il faut bien comprendre le problème de cet apostrophe. Il fait buger les requêtes oui, et quand c'est juste un utilisateur novice c'est pas bien grave ; par contre l'acte peut très bien venir d'un pirate et c'est ce qu'on appelle de l'injection SQL.

Imagine qu'il te fasse un DROP datable etc ...

Ce problème se pose bien avant tes requêtes. Il faut toujours tester le contenu et le formater dans le cas d'un contenu texte.

Ensuite tu peux construire tes requêtes avec plus de sérénité. Ce qu'il faut penser également, créer un utilisateur mysql dédié au site en limitant au maximum les droits d'accès. pas de DROP ni de TRUNCATE par exemple Smiley cligne

Bon courage !
Modifié par mini-truc (14 Oct 2014 - 16:29)