

会員登録せずに、お気に入り機能や、コメント履歴などを管理する方法について教えて下さい。  
言語はPHPを想定し、個人情報は取り扱わない方向で。

通常こういったサービスはユーザー登録を登録させて、ログインした状態で使えるようにすると思いますが、簡易的に行うにはどうしたらよいでしょうか。  
`md5("一意のID")`としてハッシュ化したセッションIDをクッキーかローカルストレージに持たせて管理して大丈夫でしょうか。


CC BY-SA 3.0
2015-01-18T14:38:17.480
4791
2015-01-19T15:17:05.483
5855
question
php
会員登録せずに、お気に入り機能や、コメント履歴などを管理する方法。


書いた通りにしていただければいいと思います。  
ただ自分でセッションを管理しようとするより人気なPHPセッションライブラリを使った方がいいと思います。

後は、セッションを持っているけどログインされていないユーザーがログインすると、どうやってセッションをログインユーザーのアカウントに付けらればいいのかなどをこれから考慮しなければならないかもしれません。


CC BY-SA 3.0
2015-01-18T19:31:50.087
4797
2015-01-18T19:31:50.087
7358
4791
answer


十分に長いハッシュなどランダムな文字列を用いて、ユーザーごとに異なるurlを発行する方法もあるかと思います。

値(文字列)が推測される可能性がありますので、扱う情報の程度によっては、さらにパスワードを発行しておいて、アクセス時に入力確認するといった方法もあるかもしれません。

簡単なチャットや飲み会用出欠管理サービスにはこういう方法を採用しているところを見かけます。


CC BY-SA 3.0
2015-01-19T00:59:35.767
4804
2015-01-19T00:59:35.767
3313
4791
answer


大抵そのような機能を実装しているサイトではクッキーに一意なIDを割り振って、ユーザーを追っていると思います。

md5は一意なIDを作るのに向いていなそうです。  
下記を参考にしてみてください。  
「より高速に、推測困難な一意なIDを生成する方法」  
<http://pentan.info/php/sample/uniq_id.html>

もしくは、簡易的なお気に入りだけとかの場合はcookie自体にお気に入りの情報を持たせる方法もあります。

ただいずれにしても、クッキーを削除してしまった時に戻すが出来ないのでそのリスクが取れるかどうかは十分に判断した上で実装したほうが良いと思います。  
特にコメント機能があるならば、再編集不可であれば比較的問題ないですが、クッキーが消えてコメントが消せないなどのユーザークレームにならないかどうか注意してください。


CC BY-SA 3.0
2015-01-19T03:19:54.567
4811
2015-01-19T03:19:54.567
2772
4791
answer


基本的には、おっしゃるように通常のセッションと同様に ランダムなID を発行し、それをブラウザに記録させる方法を用いれば問題ないかと思います。

もちろん、Cookie や WebStorage
を用いた場合、設定された期限が来たり、ブラウザが変わったりした場合などでそのIDが取得できなくなりますので、情報を継続できなくても問題の無いような場合のみでしかこのような方法は使えません。

また、閲覧履歴やお気に入り等のみを保持する場合は、もっと簡易的に、Cookieに直接その情報を詰め込んでも構わないかと思います。  
ただし、Cookie や WebStorage
には容量制限があることと、また、これらの情報はユーザー自身などによって書き換えることも可能で、インジェクション等が行われてしまう場合がありますので、それらに注意する必要があります。

# IDの生成方法について

他の方も書いていますが、`md5("一意のID")` などのようにした場合、第三者などが推測可能な文字列となります。  
これは個人情報が取り扱われていなくても、なりすましや攻撃などが容易に行えるため、セッションIDと同じように予測できないランダムな文字列が望ましいです。

また、`uniqid()` や
`rand()`、`mt_rand()`などは暗号学的に安全な乱数生成器ではありませんので、もし利用出来るのであれば、以下の何れかの方法でのID生成をオススメします。

## [`openssl_random_pseudo_bytes()`
関数](http://php.net/openssl_random_pseudo_bytes)

[code]

    $id = bin2hex(openssl_random_pseudo_bytes(16))
    
[/code]

## `/dev/urandom`

[code]

    $id = bin2hex(file_get_contents('/dev/urandom', false, null, 0, 16));
    
[/code]


CC BY-SA 3.0
2015-01-19T11:05:05.483
4844
2015-01-19T11:05:05.483
2944
4791
answer


以前、Cookieとローカルストレージの両方を使ったユーザー管理を行ったことがありますが、結論から申し上げると、100％ユーザーとIDを紐づけておくこと（IDの永続化）は不可能でした。

当時、ローカルストレージとCookieを複合的に利用することで、簡易的なものは実現できましたが、永続化するにはユニークなIDとパスワードくらいはユーザーに登録させる必要がありました。

もし、今、同じようなシステムを作るとしたら「確実にデータを保持する」という要件があるという前提で、IDとパスワードの登録だけは促すと思います。


CC BY-SA 3.0
2015-01-19T15:17:05.483
4855
2015-01-19T15:17:05.483
5296
4791
answer