2011-08-14 8 views
1

私は、ユーザーがテキストファイルを見るのを拒否しても、PHPでファイルにアクセス(読み取り)する方法を理解しようとしていますか? htaccessでこれを行う方法はありますか? EDIT:ファイルセキュリティが新しく、新しいものを試してみました!どのようにすべてのディレクトリから拒否できますか?それでもPHPのようなスクリプトでファイルにアクセスできますか?

+1

htaccessと一緒にいなければなりませんか?なぜあなたのドキュメントのルートの下にそれを埋めない? –

答えて

3

これは、ブロックするフォルダに.htaccessファイルを置くことで簡単に行うことができます。 .htaccessの内容はdeny from allです。その後、Webサーバーはページを提供しませんが、fopenfile_get_contentsなどでアクセスできます。

+0

はい、それでもxmlファイルのエラーを返しますか?どうしてこれなの? '警告:DOMDocument :: load()[domdocument.load]' –

+0

@Peteあなたは相対URLを使用していますか?絶対URL(http)を使用することはできません。そうでない場合、Apacheを経由して取得されます。 – Paulpro

+0

はい、ほとんどのURLを変更しました。しかし、私のiframeといくつかの画像はまだ読み込まれません。どのようなアイデアはなぜですか? –

0

これにはhtaccessを使用する必要はありません。ファイル名をドットで開始するだけで、apacheはデフォルトで自動的に無視します。私はこのトリックをPHPコードのディレクトリ全体を隠すために使います。

+0

私はそれがApacheの機能ではないと思います。あなたのシステム管理者がいくつかのディレクティブを設定するかもしれないので、apacheはドットが付いたディレクトリとファイルを提供しません。 – Timur

+0

まあ、私は自分ですべてのマシンを管理しています。私は、ubuntu/debian/redhatでは、新しいApacheのインストールではドットファイルが提供されないと言うことができます。私が見た共有ホストの少なくとも3つ(godaddy、1and1、およびdreamhost)で同じことが適用されます。私は、apacheのドキュメントを見ていきますが、私がapache(過去10年ほど)を使っていた限り、ドットファイルやドットディレクトリの内容を提供したことはありません。 – Femi

+0

うーん...私は間違っているかもしれない... – Timur

0

たとえば、Vbulletinでは、単純な.htaccessを使用して、includeフォルダがconfig.phpを読み取り不可能にするのを防ぎます。私の場合、私は運の

<Files config.php> 
order deny,allow 
deny from all 
</Files> 

ベストを使用し、

<Files *.php> 
order deny,allow 
deny from all 
</Files> 

ないワイルドカードが動作するかどうかを確認します。あなたは次のようで保護するディレクトリで.htaccessファイルを作ることができます!

0

良い質問とあなたができる比較的簡単なことがいくつかあります。

たとえば、パブリックディレクトリの下にテキストファイルを保存することができます。サブキーフォルダ内に公共の下に格納されている。例えば

/home/site_folder/key/ 

「key.ini」と呼ばれるファイル:公共以下

/home/site_folder/public_html/ 

のようになります。

公開ディレクトリのようなものは次のようになり以下の内容で

[key] 
name="enter a name here" 
text="enter random text here" 

これはあなたが使用して呼び出すことができます:

$ini_file = "path_to_file/key.ini"; // i.e. /home/site_folder/key/key.ini 
$ini_array = parse_ini_file($ini_file); 
$name = $ini_array['name']; 
$text = $ini_array['text']; 

ただし、.iniファイルはテキストではありません。あなたのテキストファイルが公開されていない場合は、上記のiniファイルと同じ方法でurlを読み込んでも安全です。「password.txt」ファイルを仮定すると、とても簡単に読むことができます:

$fh = fopen(password.txt,'r'); 
$password = fread($fh,100); 
fclose($fh); 

あなたはファイルの内容を確保したい場合は、暗号鍵として上記key.iniファイル使用して同時にデータを暗号化するために、このようなシンプルな非同期メソッドを使用することができます。

function getAesKey() { 
    if (file_exists(key.ini)) { 
     $args = parse_ini_file(key.ini); 
     if (isset($args['name']) AND isset($args['text'])) { 
      return md5($args['name'].$args['text']); 
     } 
    } 
} 

function encrypt_data($data) { 
    //AES256 symetric encryption 
    $key = getAesKey(); 
    if(32 !== strlen($key)) $key = hash('SHA256', $key, true); 
    $padding = 16 - (strlen($data) % 16); 
    $data .= str_repeat(chr($padding), $padding); 
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); 
} 

ファイルを作成したら、そのpermissioを変更することができますnsは読み取り専用です。

ので、このファイルを作成し、暗号化されたコンテンツを追加するようなもの:あなたがのために実際のコンテンツを返すために、さらに機能を追加することができ

function decrypt_data($data) { 
$key = getAesKey(); 
if(32 !== strlen($key)) $key = hash('SHA256', $key, true); 
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); 
$padding = ord($data[strlen($data) - 1]); 
return substr($data, 0, -$padding); 
} 

$fh = fopen(password.txt, "w"); //Open for writing 
    fwrite($fh, encrypt_data("My very secure password")); 
    fclose($fp); 

機能、コンテンツを復号化します毎回すべてのコードを書くのではなく、

function getPassword() { 
$fh = fopen(password.txt, 'r'); 
$password = fread($fh,100); 
fclose($fh); 
return decrypt_data($password); 
} 

パスワード・ファイルの

$password = getPassword(); 

内容、それがアクセスされた場合は、次のようなものになります:あなたはこのようにそれを呼び出すことを意味し、公共以下のファイルで

v?��cr���bV��@ 

を、誰になるだろうされていませんwww.yoursite.com/text_file.txtのようなファイルに移動して表示することができます。彼らが何とかあなたのサーバにアクセスしてパスワードファイルを見つけたら、鍵なしで暗号化されたコンテンツを解読することはできません。しかし、彼らはたぶんあなたの関数を使ってコンテンツを出力するでしょう。

私は通常、自分の暗号化クラスファイルとkey.iniをインクルードディレクトリの1つに持っていますので、現在のホスティングアカウントパスでは利用できません。これにアクセスするには、サーバーへのrootアクセスが必要です。このようにして、誰かが自分のコードをすべてコピーしていれば、キーファイルなしでファイルのロックを解除することはできません。

関連する問題