Ben herhangi bir "php iyi uygulama" kırılma am

6 Cevap php

Bu şu anda gettext, zend_translate veya herhangi bir php eklentisi ya da çerçeve içermediği (emin değilim), aklınıza gelebilecek bir çok dilli web sitesi ile ilgili en uygun yoldur.

Ben onun oldukça yalındır düşünüyorum: Ben 3 dil var ve ben (diziler şeklinde) farklı dosyalar kendi "içerik" yazmak ve takdir edebileceğiniz gibi, daha sonra, benim index.php bu içeriği arayın Aşağıdaki resim:

alt text

Ben sadece php ile başladı ve ben gerekli olandan daha fazla kod yazıyorum eğer kod XSS saldırıya açıktır ya da ben, ben php iyi uygulamaları kırıyorum olmadığını bilmek istiyorum.

EDIT: Eğer dosya ağacı görebilirsiniz böylece bir resim gönderdi (ben tembel değilim)

EDIT2: tema ir_black ve NERDTree ile Vim kullanıyorum.

6 Cevap

Ben şahsen oluşturma ve bir sözlük yardımcı işlevini kullanmayı tercih rağmen, bana her hakkı Tipler:

<?php echo dictionary("showcase_li2"); ?>

O daha sonra kolayca yöntemleri geçiş sağlayacak ve size sözlüğü üzerinde genellikle daha fazla kontrol sağlar olacaktır. Ayrıca bir dizi ile, kapsam sorunu var olacak - global $language; çok can sıkıcı kullanarak her fonksiyonu içine ithal etmek zorunda kalacak.

Muhtemelen de bir uluslararası dizeye değerler eklemek zorunda noktasına ulaşacaktır:

You have %1 votes left in the next %2 hours.
Sie haben %1 stimmen übrig für die nächsten %2 stunden.
Sinulla on %1 ääntä jäljellä seuraavan %2 tunnin ajassa.

bir yardımcı işlev için çok yararlı olabilir bir şeydir:

<?php echo dictionary("xyz", $value1, $value2 ); ?> 

$value1 ve $value2 sözlük dizge içinde %1 ve %2 içine sokulabilecektir.

Böyle bir yardımcı işlevi kolayca func_get_args() kullanarak parametreleri sınırsız sayıda inşa edilebilir.

Genellikle Tamam. Örneğin, punBB 's yerelleştirme bu şekilde çalışır. O çok hızlı. Bir fonksiyonu ya da bir nesne yöntemi veya özellik çağırarak daha hızlı. Kolayca dil fallbacks desteklemiyor beri Ama bu yaklaşım ile bir sorun bakın. Eğer Çince için bir dize yoksa Yani, bu İngilizce olarak görüntülenir olsun.

Eğer sisteminizi yükseltmek ve her dilde her şeyi çevirmek için zaman yok olduğunda bu sorun topikal.

Ben daha iyi gibi bir şey kullanmak istiyorum

lang.en.php

$langs['en'] = array(
    ...
);

lang.cn.php

$langs['cn'] = array(
    ...
);

[prepend].php (bazı ortak lib)

define('DEFAULT_LANG', 'en');
include_once('lang.' . DEFAULT_LANG '.php');
include_once('lang.' . $user->lang . '.php');
$lang = array_merge($langs[DEFAULT_LANG], $langs[$user->lang]);

Bana tamam görünüyor da, but:

Eğer birden fazla modül / siteleri için yerelleştirme var, neden çok boyutlu diziye yıkmak değil gibi görünüyor?

$localization = array(
  'module' => (object)array(
    'heading' => 'oh, no!',
    'perex'   => 'oh, yes!'
  )
);

Ben şahsen stdClass diziler dışarı creat istiyorum

$localization = (object)$localization;

böylece kullanabilirsiniz

$localization->module->heading;

Benim 2 sent :)

Eğer register_globals = On var ve $ lang ['showcase_lil'] veya diğer $ lang en set yoksa bu xss olabilir tek yoludur. Ama bu konuda endişelenmenize gerek sanmıyorum. Yani senin net düşünüyorum.

as an xss test: http://127.0.0.1/whatever.php?lang[showcase_lil]=alert(/xss/)

Bu kod yazılan ve kısaca bize, bu konuyu açıklamak için daha iyi olmaz mıydı?

Neyse, kendi dosyasında her dili koyarak ve dil bileşeni çeşit yoluyla da yükleme tamam görünüyor. Ben gettext çeşit kullanmayı tercih ediyorum, ama bu çok iyidir, sanırım.

You should make a function for calling the language keys rather than relying on an array, something like <?php echo lang('yourKey'); ?>

Izlemek için bir şey interpolasyonudur; Bu gerçekten sunucu ayarlarını mantıklı eğer XSS gizlice verebilecek tek yer. Herhangi bir noktada çeviri çizgisinde bir şey yapmak gerekirse "$ proje-> ad $ proje-> MEMBER_COUNT üye var", sen oraya gider tüm HTML kaçış emin olmak gerekir.

Ama bunun dışında, ince olmalıdır.