アプリ版:「スタンプのみでお礼する」機能のリリースについて

図を見てください

チャットシステムを作るために処理の流れ図を書いたものです

モード0が入室画面
モード1がチャット画面
モード2が退室画面

です。

図の上の様式が今まで私が作っている流れ図です。

モード0からモード1に移行するさいは、
・名前が空白ではないかつNULLじゃない
・変数のモードに1が入る
という条件でモード1に移行するようにさせました

モード1から2に移行するさいは、退室ボタンを押す事で移行するようにしました

そして問題が起きたのはここからです。
チャットに~秒たったら自動的に更新する機能をつけたら問題がおきました
自動更新したらモード1からモード0に戻ってしまうのです。

そのため、どうしたら自動更新したとしてもモード0に戻らずに1を続けるのか考えました。

そしたら下の図の処理を思いつきました。
入室画面のプログラムとそれ以外のプログラムを別にすれば例え自動更新してもモード1を繰り返すはずだと考えました。

しかし、そうなると別の問題が起きると考えました。

HPのアドレスが変わってしまうためにユーザーは入室画面からのみ入れたのが、入室画面だけでなく、チャット画面からも入れてしまうから問題だと思いました。

どのようにしたらチャット画面から入れるのを防ぐ事が出来ますか?

ドメインという物があればHPのアドレスがどこを見ても同じになると聞きましたがドメインはCでどのようにすれば、作れますか?

「HPのアドレス統一?」の質問画像

A 回答 (1件)

なんか的はずれなことを悩んでいるような気がします。


たとえこれを解決しても、この実装では次にモード0からモード1に移行するときに設定されたユーザー名が使えないという問題に直面するでしょう。なぜなら、これまでに何が行われたか (状態と言います) を覚えておくような処理があるように見えないから。

HTTPで状態を持った処理をさせたい場合、セッションを使います。
HTTPの特徴のひとつは状態を持たないこと(ステートレス)で、いつ、何度アクセスしても同じものが得られるというのが特徴です。しかし、会員向けページのようにログインした時にユーザー名や認証したという情報を維持しておきたい場合、ログイン時に割符のような値をユーザーに渡し、割符 (セッションID) を持っていることで本人だと確認するということをします。これをセッションといいます。例えば、ショッピングサイトなどではログインしなくても最初からセッションIDを渡しておき、そのセッションIDのユーザーが購入ボタンを押したものを覚えておくことでショッピングカートを実現します。

セッションではユーザーとセッションIDとなる乱数 (あるいはその他の値) を共有しますが、ブラウザにセッションIDを設定する方法として、おおまかに3つの方法が使われます。1つ目はURLに含める方法、2つ目はフォームのhiddenパラメーターに常に入れておく方法、3つ目はクッキーを設定する方法。どれにも利点欠点がありますが、今時は3つ目のクッキーを使う方法を使い、Cross Site Scripting (XSSと略される)やCross site request forgeries (XSRFと略される) 対策を十分に施します。


> どのようにしたらチャット画面から入れるのを防ぐ事が出来ますか?

モード0からモード1に移行した際にセッションIDをクッキーなどで渡すとよいでしょう。そして、モード1からモード2に移行した時に「退室しました」という画面を表示しつつ、セッションIDが入ったクッキーを破棄しましょう。
自分だったら次のようなロジックで作りますね。

クッキーからセッションIDを取得し、有効なものか判定
if (セッションIDが送られてきた) {
if (退室ボタンが押されている) {
モード2の処理 (クッキーを破棄するようHTTPヘッダで指示)
} else {
モード1の処理
}
} else {
if (入室に必要な条件が整っている) {
モード0からモード1に移行し、セッションIDが入ったクッキーを設定
同じページにリダイレクトする返事をする
} else {
モード0の処理
}
}

これまでセッションIDとずっと言って来ましたが、お金のやり取りをするわけでもなし、セッションIDの代わりにモード0からモード1に移行するときに送ってもらった"名前"を設定しても問題無いですね。
日本語の文字をセットされる可能性があり、エンコードが気になる場合は16進数表示にして設定しておくとよいでしょう。(当然、送られてきたものは16進数表示から元に戻して表示します)

> ドメインという物があればHPのアドレスがどこを見ても同じになると聞きましたがドメインはCでどのようにすれば、作れますか?

ドメインというのはDomain Name Systemのドメインのことでしょうか?ドメイン名を得て、適切に設定してあれば、プロバイダーが変わっても同じURLでアクセスできるという話ではないでしょうか。
今回の問題の解決とは全く関係がないと思います。

HTTPサーバーに接続するときはそのサーバーのIPアドレスを指定してつなぎますが、普段はだれもIPアドレスを直に指定しません。URLは大抵http://www.example.com/example/example.htmlのような感じだと思いますが、www.example.comというドメイン名からIPアドレスに変換するサービスをDNSといいます。ドメインを取得するというのは例えばこのwww.example.comのIPアドレスを自由に設定する権利を得るということで、サーバーのIPアドレスが変わってもそのIPアドレスを指すように変更しておけばIPアドレスが変わっても同じページが見えるということになります。

ドメイン名を得るにはレジストラーという業者にお金を払って設定してもらう必要があります。値段は1,000円くらいからですが、もう一度言いますが、今回の問題を解決するのには必要ありません。

あと、使っているプログラミング言語はCGIの基本的なロジックには全く影響を与えません。「C言語を使っていたら○○ができない」という話はほぼ技術が未熟な人間のデマだと思ったほうが良いでしょう。ただ、C言語だけでやろうとするとそれをサポートするような言語機構がPerlなどに比べて弱く、苦労するというだけです。例えば、CGIでありがちな"<"を"&lt;"に書き換える処理はPerlだと1行ですが、C言語だと何行かかかる処理になりますよね。


今回の問題を解くために、まずセッションについてちょっと調べてみることをおすすめします。あと、TCP/IPの入門書のようなものに目を通しておくこともおすすめします。

この回答への補足

<<なんか的はずれなことを悩んでいるような気がします。
たとえこれを解決しても、この実装では次にモード0からモード1に移行するときに設定されたユーザー名が使えないという問題に直面するでしょう。なぜなら、これまでに何が行われたか (状態と言います) を覚えておくような処理があるように見えないから。

一応クッキーを使ってデーターをわたすつもりではいました
が、
ユーザーネームが空白だったらやり直しにする(モード0のままにする)方法はどうすればいいかの問題は起きるだろうなとは思っていました


セッションではユーザーとセッションIDとなる乱数 (あるいはその他の値) を共有しますが、ブラウザにセッションIDを設定する方法として、おおまかに3つの方法が使われます。1つ目はURLに含める方法、2つ目はフォームのhiddenパラメーターに常に入れておく方法、3つ目はクッキーを設定する方法。どれにも利点欠点がありますが、今時は3つ目のクッキーを使う方法を使い、Cross Site Scripting (XSSと略される)やCross site request forgeries (XSRFと略される) 対策を十分に施します。

セッションを作るとデーターがいっぱいになりパンクするのでクッキーを使えと書いてあったので、セッションはログインが必要と思われるときに使うつもりでいました

ここで言う一つ目はgetsを使えっと言う事でしたらセキュリティの問題上危険だと思ったので使いませんでした2と3についてはすでにしてます。(そうしないとバグが起きるので)

このXSS対策とかは初耳なので調べてみますね。


>>モード0からモード1に移行した際にセッションIDをクッキーなどで渡すとよいでしょう。そして、モード1からモード2に移行した時に「退室しました」という画面を表示しつつ、セッションIDが入ったクッキーを破棄しましょう。
自分だったら次のようなロジックで作りますね。

ああ、なるほどクッキーの内容を破棄すると言う方法は思いつきませんでした。
確かにそれならできそうです。

ただクッキーの破棄の仕方が分かりません。
クッキーを設定する方法をやたら四苦八苦してたのですが、今度はどうすればクッキーを消せるかが問題になるとは困りましたね
方法を考えてみます。

>>ドメインというのはDomain Name Systemのドメインのことでしょうか?ドメイン名を得て、適切に設定してあれば、プロバイダーが変わっても同じURLでアクセスできるという話ではないでしょうか。
今回の問題の解決とは全く関係がないと思います。

たぶんそうだと思います。

ドメインを取得するというのは例えばこのwww.example.comのIPアドレスを自由に設定する権利を得るということで、サーバーのIPアドレスが変わってもそのIPアドレスを指すように変更しておけばIPアドレスが変わっても同じページが見えるということになります。

なるほどそれがIPアドレスとドメインの関係なのですね
今までなぞだったものが2つほど理解できました

>>ドメイン名を得るにはレジストラーという業者にお金を払って設定してもらう必要があります。値段は1,000円くらいからですが、もう一度言いますが、今回の問題を解決するのには必要ありません。

そのレジストラーと言う業者が設定できるなら個人では設定できないのでしょうか?
っと言いますか貧乏人なのでお金がかかることはできないのです。



>>CGIでありがちな"<"を"&lt;"に書き換える処理はPerlだと1行ですが、C言語だと何行かかかる処理になりますよね。

確かにかかりますがpealとかは遅い上に、WIN32APIを扱うには向いていない言語だと聞きますのでC言語であっているみたいです。


>>今回の問題を解くために、まずセッションについてちょっと調べてみることをおすすめします。あと、TCP/IPの入門書のようなものに目を通しておくこともおすすめします。

セッションは別のプログラムで作れた事があるのですが調べてみますね。
貧乏人ですので参考書はのどから手が出るほどほしいですよ。

補足日時:2012/12/16 09:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!