- ベストアンサー
制御コード文字の受け取りと処理
普通に作ると、制御コード文字の入力時に不具合を起こすので、何らかの処理をしなくてはなりません。 <>\"';,?&などです。 <>などは、<や>に変換してしまえば良いの、ですが他の文字は入力を許し、データファイルにも書き残したいのです。 気をつけることは、 (1)データファイルのフィールド・デリミッタを、タブなどのこれらに無いものにすること。 それから、何をしたら良いでしょう? 特に、?や&は起動時のパラメータ渡しに使いますので、それを入力されると困りますね。 \'";も同じですが、どのような処理をすれば良いのかアドバイスいただけるとありがたいです。 ちなみに、私は中級レベルと考えていただいて良いかと思います。 つまり、ゼロから作る力は無くても、フリーのCGIなどを自分の仕様に合うようにグチャグチャに改造する力はあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
フォームの送信では、次のようなことが行われます。 ・A タグの href やフォームのvalue値(HTMLに書かれているもの)に含まれる「文字参照」が実文字に置換される。 ・半角の英数字とアンダースコア以外の文字がURLエンコードされる。 ※まれにアンダースコアもURLエンコードするブラウザあり。 受信したデータは、まずフォーム入力時の状態に復元する必要があります。 これがよく「デコード」と言われている処理になります。 ・パラメータの取得、分解、及び変数への格納 ・URLデコード ・漢字コードの変換など(必要に応じて) ※作るCGIの内容により、それ以外の加工を施すこともあります。 これら「送信時の変換」と「デコード」によって、質問にあるパラメータ渡しの文字云々は心配ないわけです。 その後のデータの扱いは「手を加えず持ち回し、必要な所ではコピーを作って加工する」が基本です。 プログラムで行う処理を書き出し、それぞれの仕様に適した変換関数を作成しましょう。 その際、「ある変換関数の結果を更に変換する関数」というのを作らないことが、後の間違いを減らすことになります。 以下にいくつかの用途と必要な処理、注意事項を記しました。 参考になれば幸いです。 □外部記憶への保存、復帰 ・データが保存形式にとって問題となる文字を含む可能性がある場合、変換、復元処理を通す。 (例えば、行/レコード形式で保存する場合、TEXTAREAで入力した改行は変換しなければなりません。 Spurさんのファイル出力形式が不明なので、これ以上のアドバイスは難しいです。) □HTMLへの出力 ・< > & を文字参照に置換する。 ※掲示板など、入力データを表示するのがメインのCGIでは、デコード時にこの処理を行うこともよくあります。 ○タグの属性値として出力する際の注意 ・属性値をダブルクォートで囲む場合、属性値内のダブルクォートは文字参照(")にする。 (通常のテキストとして出力する場合でも、ダブルクォートを文字参照化して問題ありません。) ○パラメータ付きCGIへのリンク(URL)を出力する際の注意 ・パラメータのキーと値は、URLエンコードしたものを使う。 (キーはエンコードする必要のない文字列にしておくと、処理が減ってラクできます。) ・URLを組み立てる際、「キー=値」を連結する & にも文字参照の & を使う。 □正規表現としての利用 ・データ内に正規表現のメタ文字があると正しく実行されないので、quotemeta関数を通した文字列を使う。 my $tmp = quotemeta($var); $str =~ /$tmp/;
その他の回答 (2)
- duckling
- ベストアンサー率47% (88/185)
> 例えば、入力に「\1,000」を入れた場合は、CGIに引き渡される形として、 > http://www.xxx.yyy.jp/cgi-bin/xxx.cgi?\1,000 > となるわけで、その場合に困らないかと考えていました。 「\1,000」は「%5C1%2C000」 「?&\'";」は「%3F%26%5C%27%22%3B」という形に URLエンコードされて送られるので問題ありません。 デコードされたデータをあえて 自分でハイパーリンクのURLなどに入れてしまう場合はまた別です。 私が「改造だけでは中級レベルとは言えない」と思う理由は 「どのような構成でプログラムを作るか」 「その際にどのような不具合が発生するか」「不具合にどう対処するか」 それを考える必要があるからです。 「中級」 = 「普通」と考えるべきだと思うので 「CGI改造の上級」でも、「プログラミングの中級」とは言えないと思います。 データがURLエンコードされて送られる、 ということを知らない故にこの質問をしたと思うので。
お礼
わかりました。ありがとうございました。 ★「中級」うんぬんの問題 私は30年ほど前にAssemblerは勉強していたのですが、perlは基本などの勉強をせず、見よう見真似というか、実践でというか、そういう覚え方をしてきたものですから、知らないことも多いと思います。 でも、プログラミングはできますよ。perlはそれほど難しくないですからね。 しかし、これは今回の質問とは論点が違いますので・・・
- duckling
- ベストアンサー率47% (88/185)
?&\'"; は プログラムに送信される場合はURLエンコードされるので パラメータ渡しに使う文字云々を心配する必要はありません。 しかし送られたデータをそのままURLなどに格納する場合は、 エスケープしましょう。 > ゼロから作る力は無くても ゼロから作る力がないのは中級レベルとは言えないと思います。
お礼
回答ありがとうございます。 そうですか、「?&\'"; 」はそのままで受け取れますか? 以前それで失敗していたのでできないものと考えていました。 例えば、入力に「\1,000」を入れた場合は、CGIに引き渡される形として、 http://www.xxx.yyy.jp/cgi-bin/xxx.cgi?\1,000 となるわけで、その場合に困らないかと考えていました。 「ゼロから作る力がないのは中級レベルではない」ですか?(苦笑) 「グチャグチャに」改造する、と表現したのですが・・・ つまり、ほとんどゼロからの作り直しに近い改造もやっています。
お礼
非常に丁重な解説をいただき、ありがとうございました。 「なるほど~」と頷きながら読ませていただきました。 先日、フォームメールcgiを作って、アドレス欄も入力するようにして、そこに「;」や「,」で複数のアドレスを入れたらうまくいかなかったり、掲示板cgiで、「\」を入力したら異常な動作をしたのです。 それで、それらは普通では入力できないのだと考えていました。