Güvenlik
4 dk okuma
İfadeleri insanlar yazar. Motor bunları güvenilmeyen girdi olarak ele alır ve bir ifadenin yapabileceği en kötü şey, yazarının zaten görmesine izin verilen verileri yazdırmak olacak şekilde tasarlanmıştır. Bu sayfa her korumayı ve onu ayarlayan anahtarı listeler.
1. Hiçbir kod çalıştırılmaz
- İfadeler, elle yazılmış küçük bir ayrıştırıcıyla ayrıştırılır ve sabit bir değerlendiriciyle çalıştırılır. Burada
evalyoktur, dinamik fonksiyon çağrısı yoktur ve bir PHP fonksiyonunu adlandırmanın yolu yoktur. - Filtreler ve fonksiyonlar bir kayıt defterinde adla aranır.
{{ fn.system('ls') }}hiçbir şey bulamaz ve boş yazdırılır. - Ad alanları, adla kaydedilen çözümleyicilerdir. Yalnızca Ad alanları sayfasında belgelenen yollar veri okur.
2. Bir değerde ifadeleri kimler çalıştırabilir
İfadeler Global Data'yı ve diğer alanları okuyabildiği için saklanan bir değer, ifadeleri yalnızca yazan kişi güvenilir olduğunda çalıştırır:
Değerin sahibi | İfadeleri çalıştırır mı? |
|---|---|
Bir yazı | Yazı yazarı şu yetkiye sahipse: |
Bir kullanıcı profili | Kullanıcı şu yetkiye sahipse: |
Bir yorum | Asla |
Bir terim, bir widget, bir seçenekler sayfası | Evet |
Global Data | Evet (yalnızca yöneticiler düzenler) |
unfiltered_html, birine içeriğe ham HTML koyma izni veren yetkidir: tek sitede yöneticiler ve editörler, çoklu sitede (multisite) yalnızca süper yöneticiler. Katkıda bulunan ya da yazar, {{ }} yazarak bir yazının başka bir alanın değerini ya da bir site seçeneğini yazdırmasını sağlayamaz. Metinleri saklandığı gibi yazdırılır.
Karar değer başına, okuma sırasında verilir; bu yüzden bir kullanıcının rolünü değiştirmek sonucu hemen değiştirir.
Kuralı wpmcf/field/resolve_variables filtresiyle değiştirin:
// Let authors use expressions in one group only.
add_filter( 'wpmcf/field/resolve_variables', function ( $trusted, $group, $field, $object_id, $context ) {
return $group === 'product' && $context === 'post' ? true : $trusted;
}, 10, 5 );
// Never evaluate stored values on this site.
add_filter( 'wpmcf/field/resolve_variables', '__return_false' );Şuna yapılan doğrudan çağrılar: wpmcf_resolve_variables() bu denetime tabi değildir: bunlar güvenilen tema ya da eklenti kodudur. Ziyaretçi girdisini ona iletmeyin.
3. Parolalar asla dışarı çıkmaz
Kaynak | İfadedeki davranış |
|---|---|
| Boş |
Bir grup ya da tekrarlayıcı içindeki, şununla okunan parola alt alanı: | Değerden kaldırılır |
| Boş |
Bir şablonun çıktısı herkese açıktır; bu yüzden saklanan bir sır asla onun parçası olmamalıdır. Bir sitede buna izin vermek için wpmcf/field/the_password (alanlar) ya da wpmcf/global/the_password (Global Data) filtresinden true döndürün. Aynı filtreler wpmcf_the_field() ve wpmcf_the_global() ile yazdırmayı da yönetir ve karma (hashed) saklama modu asla açığa çıkarılmaz. Bkz. Parola yardımcıları ve güvenlik.
4. fn.option() bir izin listesini okur
Yalnızca şu seçenekler okunabilir: blogname, blogdescription, siteurl, home, date_format, time_format, timezone_string, gmt_offset, start_of_week. Bunun dışındaki her şey (örneğin admin_email, active_plugins ya da bir API anahtarı seçeneği) hiçbir şey döndürmez. Ad, sanitize_key ile temizlenir ve dizi ya da nesne tutan bir seçenek hiçbir şey döndürmez.
Yalnızca herkese açık bir sayfada yazdırılması güvenli seçeneklerle genişletin:
add_filter( 'wpmcf/variables/allowed_options', function ( array $options ): array {
$options[] = 'my_plugin_public_phone';
return $options;
} );5. Sonuçlar veridir, asla kod değildir
- Bir bloğun döndürdüğü metin asla yeniden değerlendirilmez. Değeri
{{ fn.option('blogname') }}olan bir Global Data değeri{{ glb.key }}ile okunduğunda blog adını değil, bu karakterleri yazdırır. - İç içe bir blok aracılığıyla başka bir ifadeye aktarılan sonuç (
{{ fn.upper({{ glb.x }}) }}), tırnakları ve ters eğik çizgileri kaçışlanmış tırnaklı bir dizeye dönüşür. Şu gibi bir değer:a') }} {{ fn.option('blogname') }} ('dizeden çıkıp ikinci bir ifade çalıştıramaz. - Programatik SEO'da içe aktarılan verideki her
{{ve}}bir boşlukla bölünür; böylece bir CSV hücresi asla şablona dönüşemez, shortcode köşeli parantezleri de kodlanır.
6. Katı sınırlar
Sınır | Değer |
|---|---|
Bir bloğun uzunluğu | 1000 karakter |
Blokların bloklar içinde iç içe geçmesi | 5 |
Parantez ve bağımsız değişken derinliği | 32 |
| 100 tekrar, 10.000 karakter |
Şuradaki ondalık basamaklar: | 10 |
Bir sınırı aşan ifade boş yazdırılır. Sınırlar, bir şablonun belleği ya da yığını tüketememesi için vardır.
7. Kaçışlama çıktıda size aittir
Motor kaçışlanmamış düz metin döndürür. Kaçışlamayı kimin yaptığı giriş noktasına bağlıdır:
Giriş noktası | Kaçışlama |
|---|---|
| Değerlendirmeden sonra çıktı biçimi için kaçışlanır |
| Ham sonuç: kaçışlayın ( |
| Ham sonuç: kaçışlayın |
Elementor ayarları | Her sonuç kaçışlanmış düz metin olarak eklenir; bağlantı bir URL olarak temizlenir |
Programatik SEO | Konuma göre: metin, HTML ( |
Bir ifadenin içinde, değer belirli bir yere gidiyorsa escape, esc_attr, esc_url ya da strip_tags filtrelerini kullanın.
8. Ziyaretçi verisi ve sayfa önbellekleri
wp.user_id, wp.user_name, wp.user_email, wp.user_login, wp.user_first_name ve wp.user_last_name ifadeleri oturum açmış ziyaretçiyi tanımlar. Bir ön yüz sayfası bunlardan birini yazdırdığında eklenti DONOTCACHEPAGE sabitini tanımlar ve önbelleğe almayı engelleyen başlıklar gönderir; böylece sayfa önbelleği bir kişinin bilgilerini herkese sunmaz. wp-admin içinde hiçbir şey değişmez. Bu adları önbelleğe alınması amaçlanan sayfalarda kullanmayın.
9. Hatalar yerel kalır
Bozuk bir ifade boş yazdırılır ve sayfa yüklenmeye devam eder. Motor şablonunuza asla hata fırlatmaz: wpmcf_resolve_variables() eklentinin hata korumasından geçer ve beklenmeyen bir hatada (ve eklenti başlatılmadan önce) şablonu değiştirmeden döndürür. WP_DEBUG açıkken neden PHP hata günlüğüne yazılır. Bkz. Sorun giderme.
Geliştiriciler için kontrol listesi
- Şunların sonucunu çıktıda kaçışlayın:
wpmcf_get_field()vewpmcf_resolve_variables(). - Ziyaretçi girdisini, yorum metnini ya da istek parametrelerini asla
wpmcf_resolve_variables()fonksiyonuna vermeyin. - Şu filtreyi olabildiğince dar tutun:
wpmcf/field/resolve_variables; güvendiğiniz her yazar, aynı yazının herhangi bir Global Data değerini ve herhangi bir alanını okuyabilir. - Şuraya yalnızca herkese açık seçenekleri ekleyin:
wpmcf/variables/allowed_options. - Önbelleğe alınabilir sayfalarda
wp.user_*kullanmaktan kaçının. wp.post_*, yazı bağlamlarının dışında boştur; bu yüzden bir terim, kullanıcı ya da yorum ID'si üzerinden başka bir yazıyı sızdıramaz.
Hâlâ takıldınız mı? Destek ile iletişime geçin