/ / Co może spowodować, że skrypt perl cgi nieprawidłowo interpretuje dane z zaksięgowanych formularzy jako zakodowane w utf-8? - perl, utf-8, cgi

Co może spowodować, że skrypt perl cgi nieprawidłowo interpretuje dane z zaksięgowanych formularzy jako zakodowane w utf-8? - perl, utf-8, cgi

Badam przyczynę błędu, który spowodował, że skrypt CGI Perla zapisuje nieprawidłowe wartości do bazy danych.

Ten skrypt perla odbiera dane z innego systemu (nie przeglądarki), który zdecydowanie wykorzystuje kodowanie ISO-8859-1. Niepoprawne dane, zapisane w bazie danych, wyglądają tak:

Gro�Gr�nF�rbung�sterreich

kiedy to powinno być

GroßGrünFärbungÖsterreich

Dowiedziałem się, że mogę utworzyć taki błędny wpis w bazie danych, modyfikując skrypt do użycia decode("utf8", $xyz) zamiast $xyz. Moje pytanie brzmi: czy są jakieś wpływy, np. Nagłówki HTTP, zmienne środowiskowe, pliki konfiguracyjne itp., Które mogą spowodować, że moduł CGI perla to zrobi decode implicitely?

Oryginalny kod źródłowy:

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

w niektórych przypadkach najwyraźniej zachowuje się jak:

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

Odpowiedzi:

2 dla odpowiedzi № 1

Powinieneś obsłużyć wszystkie dane pochodzące spoza samego programu perl jako nieprzetworzone bajty danych (oktety). Jeśli następnie wyraźnie decode przy założonym kodowaniu, przetwarzaj go w perlu (w jego rodzimym formacie) i encode to z kodowaniem, które chcesz umieścić poza swoim programem (jak w twoim przypadku w bazie danych), jesteś po bezpiecznej stronie. Wszystko inne może pójść nie tak, jak widać.

Używając uchwytów (jak pliki lub gniazda), możesz to zrobić za pomocą warstwy PerlIO, więc nie musisz wyraźnie używać dekodowania / kodowania.