• ベストアンサー

CGIアプリのセキュリティ強化

CGIの掲示板を会員制にしようと検討しています。 例えば投稿画面が <form action="BB.cgi"> <input ~~~~~~~~~> </form> となっています。しかし気づいたのですが、投稿画面のソースをローカルに保存し例えばinput などを変更しローカルから変更された項目と共に投稿されてしまうケースがあります。( <form action="ここをフルURLに設定しなおすとネットにつなげば投稿できてしまいました">) これを防ぐにはどうしたらいいのでしょうか。 自分が考えた物では指定したページのみのクリエを受け取るようにしてはどうかと思いましたが、このようなシステムを作る知識はありません。 どうぞよろしくお願いいたします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • hok212
  • ベストアンサー率66% (100/150)
回答No.1

まずは投稿処理をするCGI側に、投稿元のURLを指定します。 $baseURL = "投稿元のURL(http://から)を指定"; 次に投稿直前に「投稿元チェック関数(refCheck)」を呼び出し、返り値が0ならエラー処理をします。 $ref_flag = &refCheck; if ($ref_flag == 0) { ここにエラー処理 } refCheck関数は投稿処理をするCGIの最後のほうに入れておけばいいです。 sub refCheck { local($ref) = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; if ($ref =~ /$baseUrl/i) { return 1; } else { return 0; } } # $ENV{'HTTP_REFERER'}が投稿元のURLで、それに$baseUrlが含まれているか判別をしています。

Intel_404
質問者

お礼

ご回答有難うございました。早速試してみたいと思います。

その他の回答 (1)

  • yuuki0229
  • ベストアンサー率70% (33/47)
回答No.2

> input などを変更し フォームの改竄についてはサーバ側でデータのチェックをする必要があります。 CGIで一番狙われやすい(狙いやすい)場所ではないでしょうか。

参考URL:
http://www.ansi.co.jp/tech/cgi/security/
Intel_404
質問者

お礼

>CGIで一番狙われやすい(狙いやすい)場所ではないでしょうか。 そうですね。それをどう防ぐか質問させていただいてます。

関連するQ&A

  • 変更させずにCGIに情報を渡すには

    掲示板のスレッド作成画面になまえやURLを記入する欄がありますが、あそこに最初から入力済みにし投稿側は変更できないようにしたいのですがいまいちやり方がわかりません。 たとえば <form action="bbs.cgi"> 名前:<input type=text name="name" value="ここを入力済みにしたい" size=25 maxlength=50> </form> とします。すると投稿画面の“ 名前:ここを入力画面にしたい ”と表示されますが変更が可能なため投稿側で「名前」が変更されてしまいます。 しかし 「名前:<font size="2">QQQ</font>」 と記入すると変更は出来ないのですが、反対に情報(ここではQQQ)がCGI側に渡されません。 どうすれば変更されずにCGIに渡すことが出来るのでしょうか?

    • ベストアンサー
    • CGI
  • 直 CGI を禁止

    ネット上のフォームからの送信しか受け付けない CGIにしようと思いました。どうしたらいいですか? フォームがあるページのソースを見れば、 サブミットした時にCGIに送信されるデータが 分かるから、ローカルでHTMLソースを作成し、 そのサイトのCGIの管理人が予想しなかった データを送信することができてしまうではないですか。 これを不可能にしたいんです。 具体例だと、CGIにはサイズ sz が big か mall の どちらかしか送信されないようにしていても、 <form method=POST action=~.cgi <input name=sz><input type=submit> </form> というソースで適当な値を送信させることができる のを不可能にしたいんです。 CGIの方で big と small 以外は無効にする というのではなく、そのURLからしか送信を 受け付けなくさせたいんです。

    • ベストアンサー
    • CGI
  • ローカル環境でのCGI

    社内アンケートとして、 CGIをもちいた、アンケートを制作しております。 <FORM ACTION="http://hogehoge.local/cgi-bin/aaa.cgi" METHOD="POST" onSubmit="return form_check(this)" name=""> なまえ:<INPUT TYPE="radio" NAME="name" VALUE="OK"> ~~~~~~ ~~~~~~ <INPUT TYPE="hidden" NAME="number" VALUE=""> <INPUT TYPE="submit" NAME="answer" VALUE="送信する"> <INPUT TYPE="reset" NAME="reset" VALUE="リセット"> </FORM> </form> でhoge.cgiを動かしたいと思っております。 サーバーへアップし、cgi-bin配下でパーミッションを設定した場合はきちんと動きます。 当たり前ですが、ローカル上では動かなかったです。 社内ネットワーク上 \\hogehoge\cgi-bin\aaa.cgi ⇒ http://hogehoge.local/cgi-bin/aaa.cgi 【動かず】 hogehogeというディレクトリのcgi-binディレクトリのaaa.cgiを修正しますと そのままcgiが動くようにしたいのです。 htmlはもちろんのこと動きます。 サーバーアップ http://hogehoge.local/cgi-bin/aaa.cgi 【動作確認OK】 という状態で困っております。

    • 締切済み
    • CGI
  • CGIでのフォームの作成

    Dreamweaverを使ってHPの作成をしています。 問合せのフォームについて教えてください。 CGIの知識がないため、以前他の方が作ったHPがあって、そのソースを見ながら作っています。 その中で、いくつかわからない点があるので教えてください。 1.<form name="●●●" method="post" action="/cgi-tool/formmail.cgi">   <INPUT TYPE="hidden" NAME="FM_CONFIG" VALUE="/cgi-local/config.txt">   <INPUT TYPE="hidden" NAME="OPT:NEED:a_name" VALUE="貴社名">・・・ と続くのですが、最初のaction=以降が何のことかわかりません。上記のように書く場合は、"/cgi-tool/formmail.cgi"というCGIを作成しなければならないのでしょうか。以前の方は、"/cgi-local/config.txt"というテキストファイルは作成してありました。 2.最後に、<input type="submit" value="確認画面へ">というのをいれてボタンは表示されましたが、そのボタンを押してもページが表示されません。何か、他の作業を加えなければなりませんか? CGIというのは、サーバーによって設定をかえなければいけなかったりするのでしょうか? ちなみに、テストページで使用してみてみているのはページオン?、実際にアップするのは会社のサーバーになります。 全く知識がないためとんちんかんなことを聞いていたら申し訳ございませんが、助言をおねがいします。

  • HTMLのFORMからCGIを呼び出すとエラー

    HTMLにショッピングカートを設置しています。HTTPDを起動して自宅サーバー環境でテストしたところ、全て正常に稼動しています。ところが同じソースを実際のサーバーにアップしたところ、リンクからCGIプログラムを呼び出すと問題なく動作するのですが、formから呼び出すと動作しません。 動作しないとはブラウザーによって振る舞いが違うのですが、たとえばFirefoxでは「接続がリセットされました」、IEでは「IEではこのページは表示できません」などとなります。FORMの呼び出し行を1行削除するとエラーにならない事までは確認したのですが、削除してしまうとそもそもデータが変更されなくなります。何をどう書き換えれば自宅サーバー環境と同じようにCGIが動作するのか、アドバイスをお願いします。 1:エラーとなるFORMの書き方 <form name="form1" method="post" action="../../cgi-bin/cart/shop.cgi"> <input name="action" type="hidden" id="action" value="in_goods"> -中略ー <input name="kazu" type="hidden" id="kazu" value="1"> <input name="imageField" type="image" src="../../images/kartbtm.gif" border="0"> </form> 2:エラーとならないFORMの書き方 下記の1行をはずす。 <input name="action" type="hidden" id="action" value="in_goods"> ただし、この場合カートに商品を入れてもデータベースが更新されない。 ローカルの環境ではカートに商品を入れてから買い物が終了しメールを送信するところまで全て正常に動作しております。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • CGIの組み方が解りません

    会社のHP制作しているのですが、 見積もりフォーム作ろうと思っています。 <FORM action=http://●●●.jp/●●●cgi method=POST >←良く解りません <INPUT type="hidden" name="mailto" value="●●●@●●●.jp"> <INPUT type="hidden" name="subject" value="見積もり依頼"> <INPUT type="hidden" name="location" value="formend.html"> どこかのサイトを拝見してこのような感じで行ったのですが、 最初のform actionが良く解りません。 そもそもCGIをどのようにつくり設置するのか根本的なことが良く解りません。 何処か解り易く説明しているcgiの組み方、メールフォームの作り方などがあれば教えてください。

  • CGIの自動呼出し

    直接CGIにアクセスせずに、HOME頁からクリック無しでCGIを呼び出したいのですが、うまく実行されません。ソース(タグ)は次の通りです。 <html> <head> <title>yobidasi</title> </head> <body> <p>呼び出し前メッセージ</p> <form method="POST" action="uketori.cgi"> <input type="hidden" name="fileid" fileid="data_2002112511001.txt"> </form> <p>呼び出し後</p> </html> おそらく「呼出し後」は表示されないと思いますが、 「uketori.cgi」の画面も表示されないままです。 解決方法を教えてください。

    • ベストアンサー
    • HTML
  • チェックボックス(CGI)のズレをなくすにはどうすればよいでしょうか?

    現在メールフォームを勉強中です。チェックボックスの項目を1つだけ設定していますが、チェックを外せば下の項目が上に一段ズレて送信されてきます。 チェックが外されていてもその項目だけ“空白”もしくは“チェックなし”とかに出来ますでしょうか?お手数ですが、ご教授ください。 【html側】 <form method="POST" action="mail.cgi"> <input type="text" name="01"> <input name="checkbox" type="checkbox" value="on"> <input type="text" name="02"> <input type="text" name="03"> <input type="submit" value="確認画面"> </form> 【cgi側】 $form0 = "01"; $form1 = "チェック"; $form2 = "02"; $form2 = "03"; if($form0 eq ""){ $form_input0 = ""; } else { $form_input0 = "<p class=\"text\">$form0 = $VALUE_DATE[0]</p>";} if($form1 eq ""){ $form_input1 = ""; } else { $form_input1 = "<p class=\"text\">$form1 = $VALUE_DATE[1]</p>";} if($form2 eq ""){ $form_input2 = ""; } else { $form_input2 = "<p class=\"text\">$form2 = $VALUE_DATE[2]</p>";} if($form3 eq ""){ $form_input3 = ""; } else { $form_input3 = "<p class=\"text\">$form3 = $VALUE_DATE[3]</p>";} <FORM method="post" action="mail.cgi"> <INPUT type="hidden" name="$form0" value="$VALUE_DATE[0]"> <INPUT type="hidden" name="$form1" value="$VALUE_DATE[1]"> <INPUT type="hidden" name="$form2" value="$VALUE_DATE[2]"> <INPUT type="hidden" name="$form3" value="$VALUE_DATE[3]"> <INPUT type="submit" value="この内容で送信する"></FORM> $mbody .= "\n"; $mbody .= "フォームより以下の内容が送信されました。\n"; $mbody .= "\n"; $mbody .= "=============================================================\n"; $mbody .= "\n"; $mbody .= "・$form0:$VALUE_DATE[0]\n"; $mbody .= "\n"; $mbody .= "・$form1:$VALUE_DATE[1]\n"; $mbody .= "\n"; $mbody .= "・$form2:$VALUE_DATE[2]\n"; $mbody .= "\n"; $mbody .= "・$form3:$VALUE_DATE[3]\n"; $mbody .= "=============================================================\n"; $mbody .= "\n"; ソースは文字制限の関係で省略しています。解りにくいですが、宜しくお願いします。

    • 締切済み
    • CGI
  • 送信先CGIの選択

    <form method="post" action="file.cgi"> <input type="hidden" name="password" value="xxx"> <input type="hidden" name="action" value="zzz"> <input type="text" name="name" size="50" value=""> </form> この場合、送信先CGIがfile.cgiに固定されていますが、action="送信先"をリストボックス等を使って複数選択できるようにしたいと考えています。可能でしょうか?

    • ベストアンサー
    • Perl
  • 1つのsubmitボタンで2つのCGIを呼び出すことは可能ですか?

    今は、htmlで <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form action="abc.cgi" method="get"> 以下省略 <input type="submit" value="送信"> </form> <form action="xyz.cgi" method="get"> 以下省略 <input type="submit" value="受信"> </form> </body> </html> という感じで書き、2つのボタンで個々に2つのCGIを呼び出していますが、 これをメールの送受信のように、1つのボタンで2つのCGIを呼び出すことは可能なのでしょうか。 教えてください。お願いいたします。

    • ベストアンサー
    • CGI

専門家に質問してみよう