şablon olarak ayrı php dosyası - güvenlik tehlikesi?

4 Cevap php

Ben php için çiftleşmiş sistemleri bakıyordu, ve ben saf php kodu kullanmak istediğim çözüm gibi görünüyor inanmak için geldim.

Ben yalnız geliştirici değilim, bu yüzden smarty gibi Şablon motorları içeri çalışmak için bir nerfed arenada gerek yok tasarımcıları "İç platform etkisi" muzdarip görünüyor var. Ben iyi uygulamalar (pre-bilgisayarlı değerler, yalnızca foreach kullanın) ile sopa varsa, ben bu işe yarayacak.

Amacım her sayfa tarafından paylaşılan html dizesi için tek bir kaynak olmasıdır. Benim düşünce şunlardır üzerinden erişilen ayrı bir php dosyası, bu hedefe ulaşmak için iyi bir yol olmasıdır.

'Ben şu anda özel bir şey düşünemiyorum, ama birisi şablonun adını tahmin verebilir ve belki de fazla bi şey açığa, doğrudan talep - Ancak, ben bu site için bir güvenlik tehlikesi olabilir endişeleniyorum Göremiyorum. Ben bu kötü olabilir bir önsezi var (ben. Bunu kendisi isteği olup olmadığını görmek için bir kontrol koymak varsayalım), bu yüzden devam edin ve bunu, ben ne olacağını korkulan şeyi yaratmak ve istemiyorum uzakta bu işi atmak.

Ayrı bir dosya iyi bir fikir değilse, temelde bütün site için bir dize saklamak için başka ne kullanmalıyım? Bir A dize sabiti) I (sprintf kullanabilirsiniz ki, içerir? Sayfa-özel html parça argümanlar html dize döndüren bir fonksiyon?

4 Cevap

HTTP üzerinden servis edilmelidir Dosyalar Lütfen webserver şey (not PHP, at least) kullanıcılara sunulmasına izin vermez hangi bir dizine saklanmalıdır.

İki olasılık:

  • DocumentRoot dışında bu dosyaları
  • Apache herhangi bir dosyayı hizmet etmek mümkün olmayacaktır hangi ya, bir alt dizinin bu dosyaları koydum.

Bu tür "hizmet değil" dosyaları genellikle gibi şeyler şunlardır:

  • yapılandırma dosyaları
  • kütüphaneler / çerçeveler
  • veri dosyaları (like an SQLite database, for instance ; or i18n files)


The first solution : your directories could look like this :

  • data/
    • i18n/
    • i18n/your-file-here.php
  • library/
  • www/            <- this is Apache's DocumentRoot
    • index.php
    • another-php-file.php


And for the second solution, just disable access to the directory containing your "data" or "libraries" files, putting in it a .htaccess (If your webserver is Apache) file containing something like

Deny From All

Bunun üzerine, Apache herkes doğrudan HTTP üzerinden bu dizindeki dosyalara erişmek için izin vermez, ancak çalıştırılabilir PHP komut (in another directory) hala onları dahil etmek mümkün olacak.

Basit, gerçekten; Eğer istersen dosyayı adlandırın, ancak dosyanın üstündeki bu satırı içerir, sonra uzantısı olarak "inc.php." Kullanın:

if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME'])) {
    die;
}

dosya doğrudan erişilen bu senaryoyu öldürecek.

EDIT: benim daha kirli hızlı-ve-ise Pascal Martin'in çözümü, BCP ile tutarak muhtemelen daha fazladır. Ben de kullandım, ve iyi olacak gibi görünüyor ya ettik.

Ben de ayrı bir şablon dosyasını kullanarak gibi. Genellikle benim config dosyasındaki sabit tanımlarsınız ve daha sonra bu gibi dahil dosyasının üstündeki o sabiti için bir kontrol koymak:

Config sabit ayarlayın:

define('_VALIDPAGE', true);

Dahil dosyasında sabiti Giriş:

defined('_VALIDPAGE') or die('Not allowed');

Dahil dosya sadece uygulama içinde yüklenecek, böylece bu yapar.

bu doğru php konum kendi içinde güzel bir şablon sistemi, sürece "şablon" dosyalarında bunun belirli bir alt kümesi için sopa gibi. ancak web sayfası başına tek bir şablona insistance pratik: daha sık değil Eğer birkaç şablonlar üzerinde çoğaltılmış parçaları olduğunu göreceksiniz.

Neyse, ayrı dosyalar gayet iyi. (ağaç) kaynak dizininde (ağaç) ayrı bir dizine şablonları koyarak benim deneyim kötü bir fikir olduğunu: kavramsal mesafe, gerçekten kullanılan ne gevşek görme büyür ve ne değildir, ve sonuç olarak, epeyce şablonları var öldü ama onların devlet çok açık olmadığından, gömülü değil.

benim önerim: Uygun web sunucusu yapılandırması ile korunan birlikte "program" dosyaları ile "şablonlar", tutmak

DocumentRoot /www
AddType application/x-httpd-php .php

<Files ~ \.tpl$>
 deny from all
</Files>

/www/
  dir1/
    file.php
    file.tpl
    another-file.tpl
  dir2/
    other-file.php
    other-file.tpl
    yet-another-file.tpl
  ...
  common/
    shared-file.tpl
    another.tpl