Veri dezenfeksiyonu: Kod örnekleri ile En İyi Uygulamalar


15

WordPress için güvenli temalar yazmama yardımcı olmak için veri sanitizasyonunu (veri doğrulama değil) anlamaya çalışıyorum. En iyi uygulamaları detaylandıran tema geliştiricileri için kapsamlı bir rehber bulmaya çalışarak İnternet'te arama yaptım. Veri Doğrulama başlıklı kodeks sayfası da dahil olmak üzere karşılaştığım birkaç kaynak vardı, ancak hiçbiri benim için yararlı olmadı. Kodeks sayfasında kullanılabilir sanitizasyon işlevleri, kullanımları ve ne yapıldıkları listelenir, ancak neden birini diğerinin üzerinde kullanacağınız ya da hangi durumda belirli bir sanitasyon işlevi kullanırsınız açıklanamaz. Bu yazının amacı, herkesten kötü / onaylanmamış kod örnekleri ve uygun sanitasyon için nasıl yeniden yazılması gerektiğini bildirmesini istemektir. Bu, posta başlığını veya post thumnails src'yi sterilize etmek için genel kod veya$_POST Ajax isteklerine ilişkin veriler.

Ayrıca, veritabanını eklemek / güncellemek için WordPress işlevlerinin (örneğin aşağıdaki kod bloğunda belirtilenler) otomatik olarak sizin için dezenfekte etme işiyle ilgilenip ilgilenmediğini bilmek ister misiniz? Evetse, bu WordPress işlevlerine gönderilen verileri sterilize etmek için ek önlemler alacağınız istisnalar var mı?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

Ayrıca, HTML HTML'yi PHP satır içi HTML'ye karşı PHP'de yankılanırken dezenfeksiyonun farklı yapılması gerekiyor mu? Sorduğum şeyden daha açık olmak için kod İşte:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

Yukarıdaki ifadelerin ikisi de aynı şeyi başarmaktadır. Fakat farklı şekilde santrifüjlenmeleri gerekiyor mu?


1
Neyi sterilize etmeye çalıştığınızı biliyor olsaydık yardımcı olabilir . Temalar veri sunmak içindir ... yalnızca kullanıcının size gönderdiği verileri sterilize etmeniz gerekir ve gönderiler genellikle eklentiler tarafından işlenir.
EAMann

@EAMann Çıkıştan kaçmak için esc_attr, esc_html vb. Eğer Yanlışsam beni düzelt. Veri sunmak, veri çıktısı yaptığınız anlamına gelir, bu nedenle temalar içinde de kaçmak gerekir. Aksi takdirde esc işlevlerine ihtiyaç olmazdı. WordPress temalarında sanitize etmeyi bir bütün olarak anlamak istiyorum ve bir veya iki kod parçasının sanitize edilmesiyle sınırlı değil.
John

"Veri sunmak, veri çıkışı yaptığınız anlamına gelir, bu nedenle temalar içinde de kaçmak gerekir" - hayır. Yine, sadece güvenmediğiniz verilerden kaçmak zorundasınız
onetrickpony

@OneTrickPony Benim için daha netleşiyor. Bunu kesinlikle anladığımdan emin olmak için - HTML'den çıktılarsam yorum içeriğinden kaçabilirim, ancak yorum kimliğinden veya posta kimliğinden kaçmazdım. Üzgünüz, birbiri ardına sorularla sizi rahatsız etmek için.
John

2
"Sadece güvenmediğiniz verilerden kaçmak zorundasınız" - tamamen katılıyorum. Ekleyeceğim tek şey asla verilere güvenmemeniz;)
Ian Dunn

Yanıtlar:


12

Bu kodeks sayfası bence oldukça iyi açıklar.

En önemli ve yaygın olarak kullanılan işlev muhtemelen esc_attr. Bu örneği ele alalım:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

$author_nameBir "karakter içeriyorsa , özniteliğinizi kapatırsınız ve bu karakteri takip onclick="do_something();"ederse daha da kötüleşebilir :)

Bunu yapmak print esc_attr($author_name), bu karakterlerin kodlanmasını sağlar ve tarayıcı yapması gerekmeyen şeyleri yapmaz.

İhtiyacınız olmayan bir durum vardır: bir sayı beklerken, bu durumda giriş verilerini tamsayıya atabilirsiniz, örneğin:

print (int)$_POST['some_number'];


Burada listelediğiniz meta * işlevleri, veritabanı depolama girdisini sterilize etmeye özen gösterir, bu yüzden endişelenmenize gerek yoktur.

wpdb->prepare()Eğer DB kendini sorgular yaptığınızda yöntem kullanılması gerekir. İşte bir örnek:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%sVe %danahtar kelimeler ayıklanmış $ _POST değerlerle değiştirilir alacak.

WP.org deposundaki birçok eklentide gördüğüm çok yaygın bir hata, önceden hazırlanmış bir sorguyu ona (ve kötü hazırlanmış) geçirmektir:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

Bunu yapma :)

Ayrıca, HTML HTML'yi PHP satır içi HTML'ye karşı PHP'de yankılanırken dezenfeksiyonun farklı yapılması gerekiyor mu?

Yukarıdaki ifadelerin ikisi de aynı şeyi başarmaktadır. Fakat farklı şekilde santrifüjlenmeleri gerekiyor mu?

Hayır.


Girişleriniz için teşekkürler. Açıklamanız benim için işleri daha açık hale getiriyor.
John

Ayrıca küçük bir açıklama gereklidir. Ben PHP içinde bir var (örneğin $ var = 'string';) bir dize geçirmek ve bir HTML özniteliği olarak yankı, yankı yaparken $ var sanitize. Ya da sanitize sadece veritabanından $ var değerini almış olsaydı gerekli.
John

Ekranda yankılanırken, bir şekilde veya başka bir şekilde
onetrickpony

Yani, eğer doğru anladıysam, PHP kodunda $ var'a veya veritabanından veri çekip $ var'a geçsem, her ikisi de çıktıyı esc etmemi gerektirir. Doğru?
John

Evet, eğer bu veriler kullanıcı girişi geliyorsa, örneğin bir yorumun yazarının adı gibi. Tarafından Eğer size bir değişkene biliyorum bir değer atanır anlamına "PHP kodu içinde $ var içine dize geçirilmesi", o zaman tabii ki - hayır, arındırılamıyor yok değişken
onetrickpony

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.