2012-03-03 3 views
0
でPHPのセッションを実装する手助けが必要

私はhere前にこの質問をしますが、ユーザーCheekySoftは私はちょうどなければならない代わりに、「私の問題を述べると解決策のアイデアを頼む」「私の提案されたソリューションを実装する方法を尋ねた」と指摘しました。だからここに行く。がsuPHP

私はそう

/home 
├── user1 
│   ├── [-rwx------] index.html 
│   └── [-rwx------] index.php 
└── user2 
    ├── [-rwx------] index.html 
    └── [-rwx------] index.php 

私は

<Directory /home/user1>` 
<Directory /home/user2> 

に設定Apacheのバーチャルホストを持っている場合は、[すべてのユーザがwww.example.com/user1/index.htmlまたはwww.example.com/user2/index.htmlに行くことができるように設定ファイルを持つLinuxサーバ上で

。ただし、これらのファイルのアクセス許可は0700なので、Web上ではアクセスできません。この理由から私はsuPHPを使用しています。今

<?php 
echo file_get_contents('index.html'); 
exit(); 
?> 

、suPHPを設定して、user1が表示さwww.example.com/user1/index.phpに行くことができます:引数の便宜上

は、index.phpだけ

index.phpのことで、次のしていると言うことができますindex.html。同様に、user2はwww.example.com/user2/index.phpにアクセスしてindex.htmlと表示できます。しかし、user1はでもになり、user2のindex.htmlページを表示するにはwww.example.com/user2/index.phpに、user2の場合はその逆になります。

これに対処する自然な方法は、PHP sessionsです。ページへのすべてのリクエストはメインページ(つまりwww.facebook.com)にリダイレクトされ、ユーザーはデータベースに対して検証され、正しいページにリダイレクトされます(下の画像を参照)。

User Interaction diagram

ユーザーは、ページ(すなわち。www.example.com/page1.html)に行くと、その後、有効なセッションが存在することを確認するために、ハードコーディングされページ1 の部分が存在することになります。存在する場合、ページがロードされます。存在しない場合、ユーザーはこの場合はindex.htmlにリダイレクトされます。ログインして有効なセッションが確立されると、元のページにリダイレクトされます。私たちは、これを実行するためにindex.phpを変更することができます。

indexValidate.php:

<?php 
//this is purely pseudo code, I can't guarantee it will work 
session_start(); 
require_once 'Session_Validator.php'; 
$sv = new Session_Validator(); 
$sv->validate($un, $pwd); 

echo file_get_contents('index.html'); 
exit(); 
?> 

しかし、私の設計では、これらのページ(page1.htmlpage2.htmlが...)、ユーザー独自のディレクトリにあり(index.htmlindex.php)、サーバは、このハードコーディングされたセクションが有効なセクションをチェックしていることを要求することはできません。ユーザーはファイルを編集してこのセクションを削除することができます。もちろん、これはユーザー側では馬鹿馬鹿しいでしょうが、セッションチェックセクションを上部に持つようにファイルのすべてを変更する必要はありません。私はこれをシームレスにしたい。

いくつかの注意事項:

  1. 私は、ユーザーを検証し、単一validateUser.phpスクリプトへのすべて要求をリダイレクトするようにApacheを使用することができ、有効であれば、要求元のスクリプトを呼び出します。しかし、これはsuPHPは今すでにユーザーに切り替わった副作用があり、最も可能性の高いvar-www
  2. 私はApache web login authentication

を使用したくない誰もが私の問題への解決策を提供することはできますか?

+0

私はかなり私の質問には解決策がないと確信していますhttp://stackoverflow.com/a/9561335/654789 – puk

答えて

1

どのようにすべてのユーザーのためのApacheの書き換えルールの作成については、すべてのHTMLページ

のために1人のPHPラッパーを作成するRewriteRuleのようなものが考えられます。

RewriteCond %{REQUEST_URI} !^/auth 
RewriteRule ^(.*) /auth/wrapper.php?uri=$1 

そしてwrapper.php中:

  1. ユーザーが有効かどうかを確認します。ない場合は、検証済みの場合uri=<...>

    echo file_get_contents('<...>');

EDITで述べたファイルをロード、/auth/validate.php?redirect=<where-I-came-from>

  • にリダイレクト: あなたはwrapper.phpへのシンボリックリンクを作成することができますが、その後のアクセス許可を設定しますユーザーへのシンボリックリンク。あなたが認証フォルダにこれを行うことができます:

    ln -s wrapper.php username1.php 
    chown -h username1:username1 username1.php 
    

    その後、あなたはこのようなフォルダを取得ウィル:

    -r--r--r--. 1 var-www var-www 15 march 3 12:45 wrapper.php 
    lrwxrwxrwx. 1 username1 username1 17 march 3 12:47 username1.php -> wrapper.php 
    lrwxrwxrwx. 1 username2 username2 17 march 3 12:52 username2.php -> wrapper.php 
    lrwxrwxrwx. 1 username3 username3 17 march 3 12:52 username3.php -> wrapper.php 
    

    に注意してください:ユーザーもそれを作るために認証ディレクトリ を読み取ることができなければなりませんより安全にwrapper.phpを別のディレクトリに置くことができます。

  • +0

    私はそれを試しました。問題は誰が 'wrapper.php'を所有しているのでしょうか?所有者がapacheの場合、 'wrapper.php'はユーザーapacheとして実行されます(私は' www-data'だと思います)。*スクリプトがアクセスしようとしたときに*考えています。例えば、/ home/user1/index。そのファイルは '0700'と異なる所有者を持っているので、それを実行することはできません(同じ理由で'/home/user1/index.html'を読むことはできません)。 – puk

    +0

    これで、ユーザーが所有する各ユーザーのラッパークラスを作成できるようになりました。そのため、ユーザーによって呼び出されると、suPHPはそのユーザー**としてスクリプト**を実行します。しかし、どのように私はそのファイルを変更することからユーザーを制限するのですか(それは結局のところ非常に敏感です)?どういうわけか、これらの「ユーザー」ファイルを、ユーザーがアクセスできないがApacheは別のディレクトリに置くことはできますか?あなたは何かに乗っているかもしれません。親ディレクトリの所有者以外のユーザーがファイルを所有できますか(スティッキディレクトリは除外されていますか)? – puk

    +0

    しかし、suPHPはシンボリックリンクの所有者、または実際のファイルを使用しますか? '/ etc/validator(var-www 0700)'、 '/ etc/validator/user1(var-www 0700)'と '/etc/validator/user1/validate.php(user1 0700)'のようなものを使った。 。この方法では、ファイルはuser1に属しますが、user1は 'validator /'や 'user /'にアクセスできないので、ファイルを編集できません=) – puk

    関連する問題