Statik dosyalar (html, css, img, vb) erişimi kısıtlamak için PHP / Apache Kullanımı

7 Cevap php

Eğer html, css, js, img ve sunucusu üzerinde bir dizin içindeki vb dosyaları çok var diyelim. http://example.com/static-files/sub/index.html: Normalde, internet topraklarda herhangi bir kullanıcı bu yüzden gibi sadece tam URL yazarak bu dosyalara erişmek olabilir

Şimdi, sadece yetkili kullanıcıların bu dosyaları yüklemek mümkün olmak istiyorum? Bu örneğin, kullanıcıların bu gibi bir URL'den ilk oturum diyelim: http://example.com/login.php

Nasıl izin index.html dosyasını (ya da "statik dosyaları" altında dosyalardan herhangi) görüntüleyebilir, ancak herkes için dosyayı kısıtlamak kullanıcı giriş?

Ben bugüne kadar iki olası çözümleri ile geldi:

Solution 1
Create the following .htaccess file under "static-files":

Options +FollowSymLinks  
RewriteEngine on  
RewriteRule ^(.*)$ ../authorize.php?file=$1 [NC]

Sonra authorize.php in ...

if (isLoggedInUser()) readfile('static-files/'.$_REQUEST['file']);
else echo 'denied';

Bu authorize.php dosya basitleştirilmiş fena halde üzerinden, ama fikir olsun.

Solution 2
Create the following .htaccess file under "static-files":

Order Deny,Allow
Deny from all
Allow from 000.000.000.000

Ve sonra benim giriş sayfası olduğunu eklemek olabilir. Htaccess dosyasını Açıkçası bu da eski veya artık kullanılan IP'leri üzerinden temizlemek için temizlik rutin bir tür olması gerekir içeri açan her kullanıcı için bir IP ile.


I worry that my first solution could get pretty expensive on the server as the number of users and files they are accessing increases. I think my second solution would be much less expensive, but is also less secure due to IP spoofing and etc. I also worry that writing these IP addresses to the htaccess file could become a bottleneck of the application if there are many simultaneous users.

Bu çözümlerden hangisi iyi geliyor, ve neden? Alternatif olarak, bu ikisinden daha iyi olurdu tamamen farklı bir çözüm düşünebilirsiniz?

7 Cevap

Ben kimlik doğrulama işlemek ve sonra ihtiyacınız dosyaları geri dönmek için bir PHP yükleyici kullanarak düşünün. Yerine yapmanın Örneğin <img src='picture.jpg' /> <img src='load_image.php?image=picture.jpg' /> gibi bir şey yapın.

Sizin görüntü yükleyici, oturumları doğrulamak vb kimlik kontrol ve sonra tarayıcıya istenen dosyayı geri dönmek isteyip istemediğinize karar verebilirsiniz. Bu kimse sadece onları WGET veya 'yanlışlıkla' oraya atmak için gidiyor böylece web erişilebilir kök dışında güvenli tüm dosyaları saklamak için izin verir.

Sadece PHP doğru başlıklarını dönmek ve php readfile gibi bir şey () yapmayı unutmayın ve bu tarayıcıya dosya içeriğini dönecektir.

Ben birkaç büyük ölçekli güvenli web sitesinde bu çok kurulum kullandık ve bir cazibe gibi çalışır.

Düzenleme: Ben şu anda inşa ediyorum sistem Javascript, Görüntü ve video yüklemek için bu yöntemi kullanır ama CSS biz güvence ile çok endişeli değildir.

Ben aynı konuda bir şey düşünüyordum. Ben PHP motoru servis edilir her küçük kaynak için çalışan ile eşit derecede memnun değilim. Farklı bir odaklanma ile olsa ben, here birkaç ay önce aynı damarda bir soru sordu.

Ama ben sadece might iş o bir awfully ilginç bir fikri vardı.

  • /sessions yere web sunucusu üzerinde adlı bir dizin koruyun.

  • Bir kullanıcı oturum açtığında, /sessions olarak oturum kimliği boş bir metin dosyası oluşturun. Örneğin 123456

  • /sessions/123456/images/test.jpg: PHP uygulaması, bu gibi görüntüleri üzerinden hizmet

  • Lütfen htaccess dosyasında, iki yönlendirme komutları var.

  • /sessions/123456/images/test.jpg /sessions/123456?filename=images/test.jpg çeviren bir

  • Belirtilen dosya -f bayrağını kullanarak olup olmadığını herhangi bir //sessions/(.*) aramaları ve çek yakalar bir ikincisi. /sessions/123456 yoksa, bu kullanıcı dışarı açmış ya da oturum süresi doldu demektir. Bu durumda, Apache 403 gönderir ya da bir hata sayfasına yönlendirir - kaynak mevcut artık.

Bu şekilde, biz sadece tek bir kontrol "dosya var" yaparak mod_rewrite yarı oturum kimlik var!

Ben anında mod_rewrite ifadeleri oluşturmak için yeterli rutin zorunda değilsiniz, ama yazmak için yeterince kolay olmalı. (Ben bamya @ sizin yönde umarım arıyorum :)

Notes and caveats:

  • O. Htaccess (kuyu mümkün olabilir), bir dosyanın mtime kontrol etmek mümkün olmadıkça doldu oturum dosyaları, bir cron işi kullanarak hızlı silinmiş olması gerekir.

  • Görüntü / kaynak yüzden% 100 koruma, sürece oturum var gibi to any client mevcuttur. Belki denklemi içine istemci IP (oluşturduğunuz = dosya ismi) ekleyerek bu geçici bir çözüm ve% {REMOTE_ADDR} için ek bir kontrol yapabilirdi. Bu. Htaccess ustalık gelişmiş ama ben bu yapılabilir eminim.

  • Kaynak URL'ler statik değildir, ve log-in her zaman alınmak zorunda, böylece hiçbir önbelleğe alma.

I very bu geribildirim ilgilenen, herhangi bir eksiklikleri veya imkansızlıklar ben ardı olabilir ve başarılı uygulamaları (ben bir testi kendimi kurmak için şu anda vaktim yok) değilim.

Bir rewrite map, kullanıcının kimlik bilgilerini doğrular ve ya uygun bir kaynak ya da bir "erişim engellendi" sayfası için onları yönlendirir oluşturun.

Htaccess dosyalarının içeriğini bakımı bir kabus olarak görünüyor. Ayrıca, belirtilen objektif users client ip addresses bu içeriğe erişmesini olmayan kimlik doğrulaması olmayan non-doğrulanmış önlemek için - yani yaklaşım amaç için uygun değildir:

Birden fazla kullanıcı aynı IP adresinden gelen görünebilir

Tek kullanıcıların oturum birden adreslerinden gelen görünebilir.

I worry that my first solution could get pretty expensive on the server as the number of users and files they are accessing increases

Eğer liç içeriği engellemek istiyorsanız ve HTTP authenitcation kullanmak istemiyorsanız o zaman mantık ek bir katmandaki tüm dosya erişimini sarma tek mantıklı bir seçimdir. Bunu test ettik - Ayrıca, bu is bir sorun için PHP kullanarak bu bilmiyorum? Ben bir opcode önbellek kullanmak özellikle, bunu teslim olabilir, sadece ne kadar verim şaşıracaksınız düşünüyorum.

Ben mime tipi ve önbelleğe alma gibi sarıcı adresleri konuların 'sadeleştirme' tahmin ediyorum.

C.

X-Sendfile

There's a module for Apache (and other HTTP servers) which let's you tell the HTTP server to serve the file you specify in a header in your php code: So your php script should look like:

// 1) Check access rights code
// 2) If OK, tell Apache to serve the file
header("X-Sendfile: $filename");

2 olası sorunlar:

  1. Sen (. Htaccess yapılandırma dosyalarına doğrudan erişim etkin veya) kurallarını yeniden yazmak için erişim ihtiyacı
  2. Sen yüklü Apache eklendi mod_xsendfile modülü gerekir

Here's a good answer in another thread: http://stackoverflow.com/a/3731639/2088061

Ben dinamik bir web uygulaması yazdı ve Webshere Application Server üzerinde konuşlandırılmış ve burada benim statik dosyaları güvenli nasıl yoludur:

İlk eklendi

<login-config id="LoginConfig_1">
  <auth-method>FORM</auth-method>
    <realm-name>Form-Based Authentication</realm-name>
      <form-login-config>
        <form-login-page>/login.html</form-login-page>
        <form-error-page>/login_error.html</form-error-page>
       </form-login-config>
</login-config>

Form tabanlı kimlik doğrulaması (giriş kullanmak için kod aşağıda verilmiştir) kullanmak için web sunucusu söyleyecektir Web.xml.

Giriş sayfasına kod:

<form id="form1" name="form1" method="post" action="j_security_check" style="padding: 0px 0px 0px 12px;">
        Username: 
          <label>
          <input name="j_username" type="text" class="font2" />
        </label>

        <br />
        <br />
        Password:
        <span class="font2" >
        <label>
      <input name="j_password" type="password" class="font2" />
      </label>
      </span> 
        <br />
        <br />
            <label>
        <input type="submit"  class="isc-login-button" name="Login" value="Login" />
        </label>
    </form></td>

Form tabanlı bir giriş gerçekleşmesi için LDAP veya veritabanı olabilir belirli bir kullanıcı registory kullanmak için web sunucusu yapılandırmak zorunda.

Size güvenli kaynaklar beyan ve kullanıcı bu kaynakları konteyner erişmeye çalıştığında otomatik olup olmadığını kullanıcı kimlik doğrulaması ya da olmadığını denetler edebilirsiniz. Hatta güvenli kaynakları ile de roller ekleyebilirsiniz. Bunu yapmak için benim Web.xml aşağıdaki kodu eklemiş

<security-constraint>
        <display-name>Authenticated</display-name>
        <web-resource-collection>
            <web-resource-name>/*</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>PUT</http-method>
            <http-method>HEAD</http-method>
            <http-method>TRACE</http-method>
            <http-method>POST</http-method>
            <http-method>DELETE</http-method>
            <http-method>OPTIONS</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Auth Roles</description>
            <role-name>role1</role-name>            
            <role-name>role2</role-name>            
        </auth-constraint>
    </security-constraint>

    <security-role>
        <role-name>role1</role-name>
    </security-role>
    <security-role>
        <role-name>role2</role-name>
    </security-role>

O rolü role1 ve role2 altında oturum kadar Yani bu kodu (beri / *) kullanıcı herhangi bir statik dosyasına bakın izin vermez. Yani bu yolla sizin kaynaklarınızı koruyabilirsiniz.

Eğer apache kullanıyorsanız, ya. Htaccess veya httpd.conf dosyasında, aşağıdaki gibi yapılandırabilirsiniz. Aşağıda *. Inc dosyasına erişimi engellemek için bir örnektir. Büyük ölçüde benim için çalışıyor.

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

Daha detaylı bilgi için bakınız: http://www.ducea.com/2006/07/21/apache-tips-tricks-deny-access-to-certain-file-types/.