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 № 1Powinieneś 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.