こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

よろしくお願いいたします。

投稿日時 - 2020-04-30 22:57:38

QNo.9742516

困ってます

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

>予約を削除しようとすると「不正な文字列があります」とエラーが出ます。

すみません前回はソース眺めただけだったので、実際に動かしてみました。
確かにエラーになってしまいます。

エラー表示してるのは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; #行頭シャープでコメントアウト

とりあえずこれで、予約&削除ができるようになったようです。
スクリプト全部は見ていないので、他に不具合もあるかもしれませんがとりあえず…。

投稿日時 - 2020-05-01 12:10:27

お礼

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

ありがとうございました。

投稿日時 - 2020-05-01 16:40:32

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>&error("予¥約削除成功しました。");

この表示文字列から、このスクリプトはシフトJISで保存されることを前提にしているようです。
というのも、シフトJISの「予」は、文字コード0x97 0x5c であるため、2バイト目が円記号コード 0x5c と一致して文字列表現としては不正なエスケープ文字となってしまうところ、もう一つ円記号を置いておくことで、「¥¥」→「¥」となって、正しいシフトJIS文字列になるというわけなんです。

ただし、日本語対応Perlであると、「予¥」という記述はかえって害があるかもしれません。
日本語対応していると、「予」はふつうに「予」1文字と解釈され、続く文字列が「¥約」となって不正なエスケープシーケンスと解釈されてしまいます。
あるいは、スクリプトをUTFで保存している場合にも、同じように「予」は「予」1文字、「¥約」は解釈不能文字、となってしまいます。

なので、たぶん直す方法は2通り。
・スクリプトをシフトJISで保存しなおして、実行する。
または
・文字列中の余計な円記号を削る。(「予¥約」→「予約」置換)
※シフトJISには他にもダメ文字(2バイト目0x5c)があるので、一通り確認してください

どちらかで、動くと思います…。

投稿日時 - 2020-05-01 00:58:03

補足

早速のご回答ありがとうございます。

動くには動くのですが,いちばん下にある「削除」のボタンが機能せず,予約を削除しようとしてクリックすると,「不正な文字列があります」とエラーが出ます。

シフトjisで保存すると,文字化けして表示されますので,文字列(予,表)を修正しましたが,削除の機能だけ使えていません。古いことはわかっていますが,シンプルで使いやすいので,もう少し生かしたいと思っています。

どうかご教示いただけますと,ありがたいです。

投稿日時 - 2020-05-01 10:06:10

あなたにオススメの質問