php + mysql + apacheを使用してファイルアクセスを制限する方法

ディスクに保存されているファイルへのアクセスを制限するタスクは非常にまれですが、書き込み時に発生する可能性があります。ファイルを販売するオンラインストアまたはrapidshare.deなどのファイルサーバーです。 この記事では、php、mysql、およびApache Webサーバーの特別なモジュールを使用してアクセスを制御する3つの方法を検討します。





方法#1:シンボリックリンクを使用する



これは私の意見では最も簡単な方法であり、追加のApacheモジュールをインストールする必要はありませんが、同時に、純粋な形式では、これは最も柔軟性の低い方法であり、* nixを実行しているサーバーでのみ動作します。 暗闇の中で、この方法はファイルのホスティングに最適です。

あなたがする必要があること:

1. 2つのディレクトリを作成します。1つにはすべてのファイルを保存し、アクセスを制限する必要があります。2つ目は、今のところ空です。 たとえば、次のディレクトリを作成しました:membersおよびfree;



2. membersディレクトリで、「すべてから拒否」という1つのディレクティブを使用して.htaccessファイルを作成します。そのため、このディレクトリとその中にあるすべてのファイルを閉じます。



3.たとえば、メンバーディレクトリにtest.htmlファイルを作成します。 http経由でこのファイルにアクセスすると、Forbidden、つまり このファイルへの直接リンクを持っていても、ユーザーはダウンロードできません。



4.ユーザーがサイトにログインしたか、他のアクションを実行した後、閉じたファイルにアクセスできると仮定します。 彼にアクセスを許可するには、.htaccessで閉じられていないディレクトリにこのファイルへのシンボリックリンクを作成するだけです。 私の場合、次のようになります。

exec('cd free; ln -s ../members/test.html test.html');





したがって、無料のディレクトリには、membersディレクトリからのファイルへのリンクがあり、ユーザーをそのディレクトリにリダイレクトするか、URLを発行できます。



シンボリックリンクの名前とそれがアクティブになるまでの時間にハッシュを追加することも可能であり、必要です。 期限切れのリンクを削除するには、CLIスクリプトを記述して、N分ごとにクラウンで実行するのが非常に簡単です。



方法#2:mod_auth_mysqlモジュールを使用する



このモジュールを使用すると、プライベートの.htaccessディレクトリからファイルをダウンロードするときにユーザー認証を実装できます。 ユーザー検索はMySQLテーブルで実行されます。 モジュールの最新バージョンをダウンロードし、 こちらのドキュメントを参照してください

メソッド#1と同じ例を使用して、このモジュールの操作を検討してください。ただし、ここでは、membersディレクトリのみを作成します。

あなたがする必要があること:



1.ほとんどの場合、サイトのデータベースには既にサイトの登録ユーザーのリストが保存されているテーブルがあります。その場合、md5パスワードハッシュを保存するこのテーブルにフィールドを追加する必要があります。 しかし、以来 全部持っていないので、最初からテーブルを作成します。

CREATE TABLE users (

id int(11) unsigned not null auto_increment primary key,

login CHAR(50) NOT NULL,

password CHAR(50) NOT NULL,

unique key login_idx (login)

)






テーブル構造からわかるように、ログインフィールドは一意である必要があり、NULL値を含めることはできません。



2. membertディレクトリで、.htaccessファイルを編集し、次のファイルを書き込みます。

AuthName "Need authorization" #

AuthType Basic #

AuthMySQLHost <mysql_database_host> # MySQL

AuthMySQLUser <mysql_database_user> # MySQL

AuthMySQLPassword <mysql_database_password> # MySQL

AuthMySQLDB <mysql_database_name> # MySQL

AuthMySQLUserTable users # ,

AuthMySQLNameField login #

AuthMySQLPasswordField password # md5

AuthMySQLPwEncryption md5 # ,

AuthMySQLEnable On #

require valid-user # , ..








3.プライベートディレクトリからファイルを要求します。 これを行うには2つの方法があります。

3.1 example.com/members/test.htmlなど、目的のファイルのURLを指定するだけです。この場合、ユーザーにはユーザー名とパスワードを求めるダイアログボックスが表示されます。 この方法は、特にフォトギャラリーの表示など、小さなファイルの大きなリストにアクセスする場合には、あまり便利ではありません。

3.2次のように、ログインとパスワードをファイルURLに直接追加できます。

test_login :test_password@example.com/members/test.html-この場合、ユーザー名とパスワードが正しい場合、ユーザーはすぐにファイルにアクセスできます。 一致するものが見つからない場合、最初のバージョンと同様に、ダイアログボックスが表示されます。 明らかな理由で、この方法はセキュリティ上の理由からあまり魅力的ではありません。 .hataccessで「AuthMySQLPwEncryption md5」行を「AuthMySQLPwEncryption none」に置き換えると、この問題を部分的に解決できます。 この場合、パスワードの代わりに、md5ハッシュをURLに追加します。例: test_login :test_password_hash@example.com/members/test.html



方法3:mod_auth_cookie_mysqlモジュールを使用する



このモジュールの機能はmod_auth_mysqlモジュールと非常に似ています。 それでも、このモジュールには2つの大きな違いがあります。

1.ユーザーのCookieから承認情報を取得できます。

2.ユーザーのユーザー名/パスワードがCookieに表示されないため、盗難の可能性がなくなります。

モジュールをダウンロードして、そのドキュメントを参照してください



あなたがする必要があること:

1. MySQLデータベースにテーブルを作成します。

CREATE TABLE `users_sessions` (

`cookie_name` varchar(32) NOT NULL,

`cookie_value` varchar(32) NOT NULL,

`expire` int(11) default '0',

`ip` varchar(15) NOT NULL,

`login` varchar(32) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8;






cookie_name-cookie_value-cookie value、expire-unixタイムスタンプ形式のcookieの有効期限(phpでは、この形式の現在の時刻はtime()関数によって返されます)、ipはユーザーがログインしたリモートIP、loginはログインです現在のユーザー(個人の.htaccessファイルを作成する必要があります)。



2.メンバーディレクトリで、.htaccessファイルを編集し、その内容を次の内容に置き換えます。

# , "Cookie"

AuthType Cookie



# mod_auth_cookie_mysql

AuthCookieSql on



#

AuthCookieSql_DBhost <mysql_database_host>

AuthCookieSql_DBuser <mysql_database_user>

AuthCookieSql_DBpassword <mysql_database_password>

AuthCookieSql_DBName <mysql_database_name>



# , .

AuthCookieSql_DBtable users_sessions



# .

AuthCookieSql_SessnameField cookie_name

AuthCookieSql_SessvalField cookie_value

AuthCookieSql_UsernameField login



# cookie , .

# ,

# cookie

AuthCookieSql_CookieName AuthorizationCookie



# , cookie.

# , .

AuthCookieSql_ExpiryField expire



# , IP .

# , IP .

CookieAuth_RemoteIPField ip



#

require valid-user








3.サイトでのユーザー認証に成功したら、次のことを行います。



// cookie

$expire = time() + 60 * 60; // cookie 1



// cookie

$cookieValue = md5($userPassword . $userLogin . $expire . $_SERVER['REMOTE_ADDR']);



// cookie

setcookie('AuthorizationCookie', $cookieValue);



// cookie

mysql_query('insert into users_sessions values ("AuthorizationCookie", "' . $cookieValue . '", ' . $expire . ', "' . $_SERVER['REMOTE_ADDR'] . '", "' . $userLogin . '")');









これらの手順の後、メンバーディレクトリにある任意のファイルにユーザーをリダイレクトできます。



それだけです。 現時点では、これらはすべて、Apache Webサーバーの制御下にあるファイルへのアクセス権を区切ることを知っている方法です。 誰かが他の人を知っている場合-リンクを共有し、喜んでそれらについて読みます。



All Articles