• ベストアンサー

cgiの記述について教えてください

「CGI RESCUE」の「簡易予約システムYoYacker(下記URL)」で、予約を削除しようとすると「不正な文字列があります」とエラーが出ます。yoyaku.cgiファイルの、どこをどう書き換えればいいですか?  http://www.rescue.ne.jp/cgi/yoyaku/ よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6849/9743)
回答No.2

>予約を削除しようとすると「不正な文字列があります」とエラーが出ます。 すみません前回はソース眺めただけだったので、実際に動かしてみました。 確かにエラーになってしまいます。 エラー表示してるのは64行目のこちら。 > if ($val =~ /\/|\n|\t/) { &error("不正な文字列があります($val)"); } パラメータにスラッシュ・改行・タブ文字が含まれている場合、ハッキングの恐れを感じて警告していると。 でもその文字列は、この予約システム自体が、各予約の判別文字列として「1F-A/20200502/0900」というようなものを渡しているんですから、自分自身でエラー原因を作り出していることになってしまってますね!? なので、ここでスラッシュは通すようにしてやります。 スラッシュを禁止文字から外し、次の行のスラッシュ→null置換もコメントアウトします。 > if ($val =~ /\/|\n|\t/) { &error("不正な文字列があります($val)"); } > $val =~ s/\///g; ↓ > if ($val =~ /\n|\t/) { &error("不正な文字列があります($val)"); } ># $val =~ s/\///g; #行頭シャープでコメントアウト とりあえずこれで、予約&削除ができるようになったようです。 スクリプト全部は見ていないので、他に不具合もあるかもしれませんがとりあえず…。

encourage-cafe
質問者

お礼

ありがとうごさいます!動きました! こんなに素早いコメントをいただき,感激しています。 ほんとうに感謝の気持ちでいっぱいです。 ありがとうございました。

その他の回答 (1)

  • asciiz
  • ベストアンサー率70% (6849/9743)
回答No.1

>&error("予¥約削除成功しました。"); この表示文字列から、このスクリプトはシフトJISで保存されることを前提にしているようです。 というのも、シフトJISの「予」は、文字コード0x97 0x5c であるため、2バイト目が円記号コード 0x5c と一致して文字列表現としては不正なエスケープ文字となってしまうところ、もう一つ円記号を置いておくことで、「¥¥」→「¥」となって、正しいシフトJIS文字列になるというわけなんです。 ただし、日本語対応Perlであると、「予¥」という記述はかえって害があるかもしれません。 日本語対応していると、「予」はふつうに「予」1文字と解釈され、続く文字列が「¥約」となって不正なエスケープシーケンスと解釈されてしまいます。 あるいは、スクリプトをUTFで保存している場合にも、同じように「予」は「予」1文字、「¥約」は解釈不能文字、となってしまいます。 なので、たぶん直す方法は2通り。 ・スクリプトをシフトJISで保存しなおして、実行する。 または ・文字列中の余計な円記号を削る。(「予¥約」→「予約」置換) ※シフトJISには他にもダメ文字(2バイト目0x5c)があるので、一通り確認してください どちらかで、動くと思います…。

encourage-cafe
質問者

補足

早速のご回答ありがとうございます。 動くには動くのですが,いちばん下にある「削除」のボタンが機能せず,予約を削除しようとしてクリックすると,「不正な文字列があります」とエラーが出ます。 シフトjisで保存すると,文字化けして表示されますので,文字列(予,表)を修正しましたが,削除の機能だけ使えていません。古いことはわかっていますが,シンプルで使いやすいので,もう少し生かしたいと思っています。 どうかご教示いただけますと,ありがたいです。

関連するQ&A