ごくごく初歩的な質問です。
自分の作ったサイト(仮にAサイトとします。)からPOSTを使い、データを以下のような感じで受け取るとします。
$data = $in_data{'data'};
ここで、ある疑問が頭をよぎったのですが、自分の作ったAサイト以外からも、POSTでデータを送る事ができるのでしょうか?
属性のあたりが関係してくるのでしょうか?
どなたか、わかりやすく教えて頂けないでしょうか?
postにせよgetにせよ、Webページから送信されるデータというのは、フォームのあるページが置かれているサーバが送信しているのではなく、実は送信ボタンを押した利用者のブラウザが送信しているんですよね。
ですから、どこのサイトに設置したページでも、あるいはPCのローカルに置かれたHTMLファイルでも、ブラウザがフォームを読み込んでいれば、そのブラウザは <form action="・・・・"> のactionで指示した先に、データを飛ばすことが出来るわけです。
この仕組みを使って、他サイトに設置されたフォームからデータを受け取って動作しているのが、たとえばGoogleなどの検索窓です。どこのサイトに設置された検索窓からでもGoogleはデータを受け取って、検索結果を表示します。Googleの場合、データの受け渡しはgetですが、考え方はpostと同じです。
とゆーことはどこからでもアクセスが可能で、掲示板などを作った場合、遠くから書き込めてしまうわけですね、、、みなさんはどうなさっているのでしょうか、、、?
掲示板などの場合、掲示板に付属する以外の書き込みフォームからのデータを受け付けてしまうと、勝手に書き込みフォームを作られてイタズラ書き込みをされたり、javascriptなどを使って大量に書き込みを送り付けられたりする恐れがありますから、この場合はデータを受け取る側のCGIで、ブラウザが読み込んでいたページがどこかということを示す「HTTP_REFERER」という変数を参照します。いわゆるリファラというやつです。そして、掲示板のURL以外のリファラが検出されたら、外部からの書き込みと判断して、エラーページに遷移させて処理を中断するなどして対処します。
2chなどの場合、ブラウザのリファラを送信しない設定にしていると「ブラウザ変ですよん」などと表示されて書き込めませんが、これは外部からの書き込みを遮断するためにリファラを参照していることの証拠で、そのため、リファラが検出されないブラウザからの書き込みも拒否しているわけです。
具体的な方法については、たとえばperlで書かれた掲示板CGIとして高いシェアを持つKENTさんのYY-BOARD
http://www.kent-web.com/bbs/yybbs.html
では、次のようにして外部からの書き込みを遮断しています。
# 他サイトからのアクセス排除 if ($baseUrl) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $baseUrl =~ s/(\W)/\\$1/g; if ($ref && $ref !~ /$baseUrl/i) { &error("不正なアクセスです"); } }
$baseUrlが掲示板を設置するURL、$ENV{'HTTP_REFERER'}がデータを送信してきたブラウザのリファラです。これを照合して、外部からの書き込みかどうかを判断しています。
Perl に限らずすべての CGI に他サイトからの POST 送信は出来ます。
HTML の
<form action="http://example.com/form.cgi">
等とするだけです。
ありがとうございます、とゆーことはどこからでもアクセスが可能で、掲示板などを作った場合、遠くから書き込めてしまうわけですね、、、みなさんはどうなさっているのでしょうか、、、?
ありがとうございました。
b-WINDさん、いつもありがとうございます。お礼を送らせて頂きます!
http://q.hatena.ne.jp/ (URLはダミーです)
特定のサイトからのみの POST しか受け付けないようにしたいということでしょうか? だったらその CGI の中で REMOTE_ADDR か REMOTE_HOST を見て判別するようにするとか、あるいはサーバの機能そのものを使って(ファイヤーウォールだとか tcp wrapper だとか)特定のホストからしか接続不可能にしてしまえば良いと思います。
さっそく調べました。
これをやってみると、なんだかよさげな感じがします。(^^;)
ありがとうございました。
CGIでデータを送ってくるのはクライアント(ウェブページにアクセスしてきた人)です。
つまりどこからでもデータを送って掲示板等に書き込むことが出来ます。
最近は自動的に掲示板を巡回して宣伝等を書き込むボットが開発されているので、これを防ぐための対策をする必要があります。
例えば、英数文字だけの書き込みは拒否するとか、書き込み時にパスワードを要求するとか、禁止ワードを設けて宣伝を防ぐとかですね。
公開されているCGIプログラムを参考にするといいと思います。
URL、ありがとうございます。非常にたすかります!
postにせよgetにせよ、Webページから送信されるデータというのは、フォームのあるページが置かれているサーバが送信しているのではなく、実は送信ボタンを押した利用者のブラウザが送信しているんですよね。
ですから、どこのサイトに設置したページでも、あるいはPCのローカルに置かれたHTMLファイルでも、ブラウザがフォームを読み込んでいれば、そのブラウザは <form action="・・・・"> のactionで指示した先に、データを飛ばすことが出来るわけです。
この仕組みを使って、他サイトに設置されたフォームからデータを受け取って動作しているのが、たとえばGoogleなどの検索窓です。どこのサイトに設置された検索窓からでもGoogleはデータを受け取って、検索結果を表示します。Googleの場合、データの受け渡しはgetですが、考え方はpostと同じです。
とゆーことはどこからでもアクセスが可能で、掲示板などを作った場合、遠くから書き込めてしまうわけですね、、、みなさんはどうなさっているのでしょうか、、、?
掲示板などの場合、掲示板に付属する以外の書き込みフォームからのデータを受け付けてしまうと、勝手に書き込みフォームを作られてイタズラ書き込みをされたり、javascriptなどを使って大量に書き込みを送り付けられたりする恐れがありますから、この場合はデータを受け取る側のCGIで、ブラウザが読み込んでいたページがどこかということを示す「HTTP_REFERER」という変数を参照します。いわゆるリファラというやつです。そして、掲示板のURL以外のリファラが検出されたら、外部からの書き込みと判断して、エラーページに遷移させて処理を中断するなどして対処します。
2chなどの場合、ブラウザのリファラを送信しない設定にしていると「ブラウザ変ですよん」などと表示されて書き込めませんが、これは外部からの書き込みを遮断するためにリファラを参照していることの証拠で、そのため、リファラが検出されないブラウザからの書き込みも拒否しているわけです。
具体的な方法については、たとえばperlで書かれた掲示板CGIとして高いシェアを持つKENTさんのYY-BOARD
http://www.kent-web.com/bbs/yybbs.html
では、次のようにして外部からの書き込みを遮断しています。
# 他サイトからのアクセス排除 if ($baseUrl) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $baseUrl =~ s/(\W)/\\$1/g; if ($ref && $ref !~ /$baseUrl/i) { &error("不正なアクセスです"); } }
$baseUrlが掲示板を設置するURL、$ENV{'HTTP_REFERER'}がデータを送信してきたブラウザのリファラです。これを照合して、外部からの書き込みかどうかを判断しています。
詳しい解説ありがとうございます。
ソースまでつけて頂いて、すいません。
解説もわかりやすく、非常に参考になりました。2chを例にして頂いて、なんだか親近感?がわきました。
また、なにかありましたら、よろしくお願いいたします。
詳しい解説ありがとうございます。
ソースまでつけて頂いて、すいません。
解説もわかりやすく、非常に参考になりました。2chを例にして頂いて、なんだか親近感?がわきました。
また、なにかありましたら、よろしくお願いいたします。