2017-02-16 1 views
1

Je recherche la cause d'une erreur qui a provoqué l'écriture de valeurs incorrectes dans la base de données par un script CGI Perl.Qu'est-ce qui peut provoquer l'interprétation incorrecte d'un script perl cgi par des données de formulaire publiées en tant que codage UTF-8?

Ce script perl reçoit des données d'un autre système (pas un navigateur) qui utilise définitivement l'encodage ISO-8859-1. Les données incorrectes, comme il est écrit à la base de données, ressemble à ceci:

Gro�Gr�nF�rbung�sterreich 

quand il devrait être

GroßGrünFärbungÖsterreich 

j'ai découvert que je peux créer une telle entrée de mauvaise base de données en modifiant le script pour utiliser decode('utf8', $xyz) au lieu de $xyz. Ma question est la suivante: Y a-t-il des influences, par ex. En-têtes HTTP, variables d'environnement, fichiers de configuration, etc., qui pourraient impliquer le module CGI perl decode implicitement?

code source d'origine:

my $ack = new CGI; 
my $xyz = $ack->param('xyz'); 

dans certains cas, se comporte apparemment comme:

use Encode qw(decode encode); 
my $ack = new CGI; 
my $xyz = decode('utf8',$ack->param('xyz')); 
+1

Vous devriez être heureux il n'y a pas de [captial sz] (https://en.wikipedia.org/wiki/Capital_%E1%BA%9E) 'ẞ' dedans. :) – simbabque

Répondre

2

Vous devez gérer toutes les données provenant de l'extérieur du programme lui-même perl sous forme d'octets de données brutes (octets). Si vous l'avez explicitement decode avec votre encodage supposé, traitez-le en perl (dans son format natif) et encode avec l'encodage que vous souhaitez mettre en dehors de votre programme (comme dans votre cas dans la base de données), vous êtes sur le côté sécuritaire. Tout le reste pourrait mal tourner, comme vous pouvez le voir. Lorsque vous utilisez des poignées (comme des fichiers ou des sockets), vous pouvez utiliser la couche PerlIO pour ne pas utiliser explicitement le décodage/encodage.

+0

Autant que je suis d'accord, pour l'instant je serais heureux de trouver les circonstances exactes lorsque les choses tournent mal. –

+1

Avez-vous considéré que la 'corruption' se produisait de la part de perl à la base de données? Quel est le codage de votre DB, qu'utilisez-vous pour l'écrire, etc ... Si l'entrée est définitivement dans iso-8859-1, votre encodage de DB est-il aussi? Surtout la partie '-X' à la fin est parfois le coupable, et cela n'a rien à voir avec utf8. Juste une pensée ... – SREagle

+0

... et bien sûr je prêche de l'eau et je bois du vin sur le côté - je ne fais presque jamais ce que j'ai suggéré, si je n'ai pas à le faire. Honte sur moi. – SREagle