2017-02-16 4 views
1

私は、Perl CGIスクリプトに間違った値をデータベースに書き込ませる原因となった原因を調査しています。perl cgiスクリプトが、投稿されたフォームデータをUTF-8でエンコードされたものとして間違って解釈する原因は何ですか?

このperlスクリプトは、ISO-8859-1エンコーディングを使用している別のシステム(ブラウザではない)からデータを受け取ります。

Gro�Gr�nF�rbung�sterreich 

とき、それは私が、私は、スクリプトを修正することにより、このような間違ったデータベースのエントリを作成することができることが判明

GroßGrünFärbungÖsterreich 

次のようになります。それはデータベースに書き込まれると、誤ったデータは、次のようになります$xyzの代わりにdecode('utf8', $xyz)を使用してください。だから私の質問です:影響はありますか? HTTPヘッダー、環境変数、設定ファイルなど、perl CGIモジュールが暗黙的にこれを行う可能性がありますか?

オリジナルソースコード:いくつかのケースで

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

明らかのように振る舞う:

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

[captial sz](https://en.wikipedia.org/wiki/Capital_%E1%BA%9E) 'ẞ'がそこにあるのは喜ばしいことです。 :) – simbabque

答えて

2

あなたは、生のデータバイト(オクテット)としてPerlプログラム自体外部からのすべてのデータを処理する必要があります。明示的にdecodeと仮定してエンコーディングした場合、perl(ネイティブフォーマット)で処理し、encodeエンコーディングでエンコードします(データベースのように)。安全面。あなたが見ることができるように、他のすべてが間違っている可能性があります。

ハンドル(ファイルやソケットなど)を使用する場合は、PerlIOレイヤーを使用してこれを行うことができます。したがって、デコード/エンコードを明示的に使用する必要はありません。

+0

私が同意するのは、今のところ、物事がうまくいかない場合の正確な状況を見つけることです。 –

+1

perlからデータベースへの 'corruption'が起こったと考えましたか?あなたのDBエンコーディングは何ですか?それを書き込むために何を使用していますか?もし入力がiso-8859-1で間違いないなら、あなたのDBエンコーディングもですか?特に最後の '-X'部分は時には犯人であり、これはutf8とは何の関係もない可能性があります。ちょっと考えました... – SREagle

+0

...もちろん、私は水を説いていて、側でワインを飲んでいます - 私がする必要がなければ、私が提案したことをほとんどしません。私には恥ずべき。 – SREagle

関連する問題