Filtrelemek için zaman / veri sterilize: veritabanı ekleme önce veya daha önce ekran?

5 Cevap php

Ben giriş veri filtreleme ve sanitizasyona sorunu çözmek için hazırlamak gibi, ben en iyi (ya da en çok kullanılan) uygulama var olup olmadığını merak ediyorum? O / filtre (vb HTML, JavaScript, ve) veri veritabanına veri ekleme önce sterilize veya veri HTML görüntülemek için hazırlandığı zaman yapılmalı iyi mi?

Birkaç not:

  • Ben PHP yapıyorum, ama ben bu cevabı dil agnostik olduğunu sanıyorum. Ama PHP özgü herhangi bir önerileri varsa, lütfen paylaşın!
  • Bu veritabanı ekleme için verileri kaçan bir sorun değildir. Zaten PDO yol tutuşa sahip olduğunu oldukça iyi.

Teşekkürler!

5 Cevap

Kullanıcı gönderilen verilerin görüntülenmesi söz konusu olduğunda, genel kabul görmüş mantra ", girdi Filtre çıktı kaçmak" tır.

HTML görüntü orta olmayacaktır zaman bilemezsiniz, çünkü veritabanına girmeden önce, vb html varlıklar, gibi şeyler kaçan karşı tavsiye ederim. Ayrıca, durumları farklı çıkış kaçan farklı gerektirir. Örneğin, Javascript bir dize katıştırma HTML daha kaçan farklı gerektirir. Önce bunu yanlış bir güvenlik duygusu içine kendinizi sükunet olabilir.

Yani, başparmak temel kural, kullanmadan önce ve özellikle bu kullanım için sterilize olup; değil önceden tutumumuzu.

(Ben sadece görüntü için, SQL için çıktı kaçan hakkında söz etmiyorum, unutmayın. Hala SQL dize bağlı verileri kaçış lütfen).

Gerekirse (bu sizin için kolları veritabanı etkileşim katmanı kullanarak değilseniz yani), veritabanında koymadan önce veritabanı için sterilize. Görüntü önce görüntü için sterilize.

Bir anda gereksiz alıntı şeklinde depolamak şeyler sadece çok sorunlara neden olmaktadır.

Eğer önemsemeliyiz filtreleme / sanitasyonuyla en az iki türü vardır:

  • SQL
  • HTML

Obviously, the first one has to be taken care of before/when inserting the data to the database, to prevent SQL Injections.
But you already know that, as you said, so I won't talk about it more.


The second one, on the other hand, is a more interesting question :

  • Kullanıcıların kendi verileri düzenlemek gerekir, eğer onlara onlar ilk başta girilen aynı şekilde iade etme ilginç; hangi bir "non-html-specialChars-kaçtı" versiyonunu saklamak zorunda kalıyoruz.
  • Bazı HTML görüntülenmesini istiyorsanız, belki gibi HTMLPurifier şey kullanmak gerekir: çok güçlü ... Ama olmak zorunda kaldığında, her veri üzerinde çalışan varsa biraz fazla kaynak gerektirebilir Görüntülenen ...

Yani:

  • If you want to display some HTML, using a heavy tool to validate/filter it, I'd say you need to store an already filtered/whatever version into the database, to not destroy the server, re-creating it each time the data is displayed
    • ama aynı zamanda "orijinal" versiyonunu saklamak gerekir (see what I said before)
    • Bu durumda, ben muhtemelen daha çok yer alsa bile, veritabanına iki sürümünü saklamak istiyorum ... Ya da en azından tekrar tekrar temiz sürümü-yeniden değil, bazı iyi önbelleğe alma mekanizmasından kullanın.
  • If you don't want to display any HTML, you will use htmlspecialchars or an equivalent, which is probably not that much of a CPU-eater... So it probably doesn't matter much
    • Eğer hala "orijinal" versiyonunu saklamak gerekir
    • ancak veri çıktılamak zaman kaçan Tamam olabilir.

BTW, the first solution is also nice if users are using something like bbcode/markdown/wiki when inputting the data, and you are rendering it in HTML...
At least, as long as it's displayed more often than it's updated -- and especially if you don't use any cache to store the clean HTML version.

Ben her zaman hemen kaçtılar gereken yerde onları geçirmeden önce şeyleri kaçış söylüyorlar. Sizin veritabanı HTML umurumda, böylece veritabanında saklamadan önce HTML kaçan gereksiz değildir. Hiç HTML başka bir şey, ya da izin verilmeyen etiketleri / izin değişim olarak çıktı istiyorsanız, önünüzde iş biraz olabilir. Ayrıca, bu süreç içinde bazı çok erken bir aşamada daha yapılması gereken ne zaman kaçan doğru yapmak için hatırlamak daha kolay.

Ayrıca HTML-kaçtı dizeleri orijinal girişi daha uzun olabilir fazlalaştı. Ben bir kayıt formu bir Japon adı koyarsanız, orijinal dize sadece 4 Unicode karakter olabilir, ancak HTML öncelemeli 〹 𐤲 䡈 ve "uzun bir dizeye dönüştürmek olabilir # 31337; ". Sonra benim 4-karakter adınız veritabanı alanı için çok uzun ve iki Japon karakter artı da muhtemelen oturum açmasını önlüyor yarım çıkış kodu olarak depolanır

Tarayıcılar gönderilen formlarda kendilerini İngilizce olmayan metin gibi bazı şeyleri kaçış eğilimi dikkat edin, ve her zaman her yerde bir Japon adı kullanan bilmiş olacaktır. Yani saklamadan önce aslında unescape HTML isteyebilirsiniz.

Çoğunlukla bu girdi, yanı sıra geliştirme ortamı ile ne planlıyor ne bağlıdır.

Çoğu durumlarda orijinal girdi istiyorum. Bu şekilde orijinal kaybetme korkusu olmadan doya için çıktı çimdik güç olsun. Bu da böyle kırık çıktı gibi sorunlarını gidermek için izin verir. Her zaman filtreleri buggy veya müşterinin giriş hatalı olduğunu nasıl görebiliriz.

Öte yandan bazı kısa anlamsal veri hemen süzülür olabilir. 1) veri tabanında dağınık telefon numaralarını istemiyorum, bu yüzden böyle şeyler için sterilize etmek iyi olabilir. 2) Sen kaçan olmadan başka bir programcı yanlışlıkla çıkış veri istemiyorum, ve multiprogrammer bir ortamda çalışmak. Ancak, çoğu durumda ham veri IMO iyidir.