Eklentiler Veri Doğrulama / Dezenfeksiyondan Hangi Bağlamlardan Sorumludur?


17

Eklentilerim / temalarımdaki tüm verilerin veritabanına girmeden önce ve tarayıcıya çıkmadan önce güvenli bir şekilde işlendiğinden emin olmak istiyorum. Benim sorunum, API'nın sizin için - saniyeler sonrası meta alanlarını kaydederken - ve eklenti / tema yazarının bunu yapmaktan tamamen sorumlu olduğu diğerleri için - sanitizasyonu işlediği durumlar olduğu - özel ayarları kaydederken olduğu gibi.

Bu sorunun kapsamı için, etki alanı düzeyinde verileri doğrulamakla ilgilenmiyorum - örneğin, bir formdaki Yaş alanının 0 ile 120 arasında olup olmadığını veya bir e-posta adresinin geçerli olup olmadığını denetleme. Ben sadece güvenlik endişe - örneğin, veritabanına kaydederken SQL enjeksiyon önlemek için SQL sorguları kaçmak veya XSS önlemek için HTML şablonları çıktı veri sanitizing.

Çıktı sterilizasyonu için, değişkenleri HTML şablonlarına yansıtırken esc_html()ve her zaman fonksiyonları kullanmanız gerektiğini biliyorum esc_attr(). Peki, şablon etiketlerini kullanmaya ne dersiniz ? Hepsi çıktıyı sterilize ediyor mu? Öyleyse, hangi bağlam için (genel HTML, etiket özellikleri vb.)? Bazı işlevlerin farklı bağlamlar için değişkenleri vardır ( the_title_attribute()ancak çoğu yoktur.

Giriş temizliği için, $wpdb->prepare()manuel sorgulamalar yaparken kullanmam gerektiğini biliyorum , ancak eklenti ayarları sayfası oluşturmak veya özel bir yazı türü için yazı meta alanlarını kaydetmek için Ayarlar API'sini kullanmaya ne dersiniz?

Şu anda Core'u kazıyordum ve sanitize olup olmadığını öğrenmek için bir işlevi her kullandığımda öğreticiler okuyorum, ancak bu hataya eğilimli ve zaman alıcı. Tüm olası durumların ve API'nın işleyip işlemediğinin kapsamlı bir listesini bulmayı umuyorum. Örneğin,

API doğrular / sterilize ediyor

  • İle meta sonrası kaydetme update_postmeta()
  • İle kullanıcı meta kaydetme update_user_meta()
  • Bir yazı başlığı çıktısı vermek için - the_title()
  • vb

Manuel olarak doğrulamanız / sterilize etmeniz gerekiyor

  • Ayarlar API'sı ile eklenti seçeneklerini kaydetme. Öğesinin 3. parametresi olarak bir geri arama iletin register_setting().
  • Doğrudan veritabanı sorguları: Sorguyu içine sarın $wpdb->prepare().
  • HTML'de değişken çıktıları. Kullanım esc_attr(), esc_html()vb
  • vb

Ayrıca API'nin neden belirli durumlarda sağladığını, ancak diğerlerinde olmadığını anlamak isterim. Verilerin bilinmeyen doğası ile ilgili bir şey olduğunu varsayıyorum, ancak kapsamlı bir açıklama duymak isteriz.


Bu soruyu beğendim. Seninle aynı düşünceye sahibim. Ne zaman manuel olarak doğrulamamız / sterilize etmemiz gerektiğine dair böyle bir liste varsa, bu harika olurdu. +1.
Anh Tran

1
@Rilwis, lütfen cevabımı gör. Her zaman doğrulamanız gerekir. Sanitasyon, daha güvenlidir, çünkü 'güvenli' bağlama bağlıdır. Genellikle WordPress bilinen verilerle WordPress API (kullanılıyorsa, the_title(), the_permalink()vs) ince ama özel verilerle (örn değildir get_post_meta()). Şüpheniz varsa, kendinizi sterilize edin - incitemez.
Stephen Harris

@StephenHarris: Yorumunuzu okudum. Bunu ben de biliyorum. Ama Ian Dunn ile aynı görüşe sahibim. Bence onun asıl nedeninin "yeterli, daha fazla, daha az değil" olduğunu düşünüyorum.
Anh Tran

1
Aslında dikkatli olmanın yanı sıra çok fazla doğrulama / sanitasyon yapmanın sakıncası yok, ama bence iki kez kaçmanın bir sorun olabileceği durumlar var.
Ian Dunn

Yanıtlar:


15

Burada iki kavram var:

  • doğrulama - verilerin geçerli olduğundan emin olmak , yani bir tam sayı bir tamsayıdır, bir tarih bir tarihtir (doğru biçimde vb.). Bu, veriler kaydedilmeden hemen önce yapılmalıdır.
  • sanitasyon - tarihi geçerli bağlamda kullanımı için güvenli hale getirme (örneğin, SQL sorgularından kaçma veya çıktıdaki HTML'den kaçma).

Doğrulama, neredeyse evrensel olarak yalnızca size bağlıdır . Bir kullanıcıdan hangi verileri sorduğunuzu ve hangi verileri beklediğinizi biliyorsunuz - WordPress bilmiyor. Doğrulama, örneğin, save_postveritabanına kaydedilmeden önce kanca üzerinde gerçekleştirilebilir update_post_metaveya Ayarlar API'sında WordPress'in verileri kaydetmeden hemen önce çağrılan bir geri çağırma işlevi belirtilerek yapılabilir.

Sanitasyon biraz daha karışıktır. WordPress'in doğal olarak bildiği verilerle uğraşırken (örneğin bir gönderinin döşemesi) WordPress'in verileri zaten güvenli hale getirdiğinden emin olabilirsiniz. Ancak 'güvenli' bağlama bağlıdır; bir sayfada kullanım için güvenli olan, bir öğe özelliği olarak güvenli olmak zorunda değildir. Farklı bağlam için (örneğin Dolayısıyla WordPress farklı fonksiyonlara sahip olacak the_title(), the_title_rss(), the_title_attribute()-) doğru olanı kullanmak gerekir böylece .

Çoğunlukla eklentiniz post meta - veya özel bir tablodaki etkinlik verileriyle ilgilenebilir. WordPress bu verilerin ne olduğunu veya ne için olduğunu bilmiyor, bu yüzden nasıl güvenli hale getirileceğini kesinlikle bilmiyor. Bu size kalmış . Bu kullanmada özellikle önemlidir esc_url(), esc_attr(), esc_textarea()gömme kodunun edememek kötü niyetli girişini engellemek için vs. WordPress'in next_posts()bir URL'yi sayfaya yazdırması gerektiğini bildiği için geçerlidir esc_url()- ancak post meta ile diyelim ki bir url'yi depoladığını bilmiyor - veya onunla ne yapmak istediğinizi (yazdırıyorsanız, esc_url()yeniden yönlendiriyorsa) esc_url_raw(). Dobut ise - dikkatli olun ve kendiniz kaçın - ve bunu mümkün olduğunca geç yapın.

Son olarak - veri kaydetmeye ne dersiniz? O zaman onu güvende tutmaya mı ihtiyacınız var? As Bahsettiğiniz yapmak emin veriler geçerlidir yapma ihtiyacını. Ancak WordPress API ( wp_insert_post(), update_post_meta()vb.) Kullanıyorsanız, verileri sterilize etmeniz gerekmez - çünkü verileri kaydederken yapmanız gereken tek sterilizasyon SQL ifadelerinden kaçmaktır - ve WordPress bunu yapar. Doğrudan SQL ifadeleri çalıştırıyorsanız (özel bir tablodan veri okumak / yazmak için) $wpdb, sorgularınızı temizlemenize yardımcı olması için sınıfı kullanmanız gerekir .

Yararlı bulabileceğiniz veri sanitasyonu ve doğrulama hakkındaki bu blog yazısını yazdım - bu konuda sizden ne beklendiğinden bahsediyorum.


Hey Stephan, açıklama için teşekkürler. Bu biraz daha iyi anlamama yardımcı oldu, ama gerçekten aradığım şey, verdiğim örnek gibi bir tür kapsamlı liste. Görünüşe göre yaklaşımınız, WP'nin ele alıp almadığını eğitimli bir tahmin yapmak veya dikkatli olun ve her zaman sterilize etmek. Anlayışımıza güvenmek yerine, yetkili ve kapsamlı bir listem olsaydı bu konuda kendime daha fazla güvenirim. Ayrıca, çift kaçmanın sorunlara yol açabileceğinden endişeliyim.
Ian Dunn

Birkaç soruyu netleştirmek için soruyu da güncelledim.
Ian Dunn

0

Bu kadar kapsamlı olduğundan emin değilim, ancak herhangi bir eklenti veya tema ile kullanıcı girişi dezenfekte edilmelidir. Veritabanı işlemleri $ wpdb-> yöntemleri kullanılarak yapılmalıdır. Tüm $ _GET ve $ _POST verileri sterilize edilmelidir.

PHP programlama için WordPress'ten daha iyi bir uygulamadır.

Sonuç olarak, eğer bir WordPress fonksiyonu varsa, onu kullanın, eğer değilse, değişkenlerinizi sterilize edin ve girişlerinizi kendiniz yapın.

Çok belirsiz olsaydım, lütfen daha spesifik bir soru sor.


3
Her zaman sterilize edilmesi gerektiğini anlıyorum, ama soru her bir durumda dezenfeksiyonu kimin yaptığı ile ilgili. Bazen WordPress otomatik olarak yapar ve bazen manuel olarak yapmanız gerekir. Soruyu daha açık hale getirmek için güncelledim.
Ian Dunn

Update_user_meta () yöntemini kullanırken bile, güncellenmiş değerler açık bir formdan veya bir kullanıcının girdisinden gelebileceği için bunu doğrulamanız gerekir. İçeriden alınan karar gibi bir komut dosyasından gelen bir if / else döngüsünden gelen bir değerse, bunu sterilize etmemelisiniz.
Ciprian

1
Eğer geçmek değeri update_user_meta()geçirildi alır stripslashes_deep()ve sanitize_meta()içinde update_metadata(), ardından $wpdb->prepare()içinde $wpdb->update(). Yani, sanitize etmeniz gerektiğini sanmıyorum. Bir şey mi kaçırıyorum?
Ian Dunn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.