Soru Html varlıkları veritabanında depola? Veya alındığında dönüştürmek?


Hızlı soru, aramak daha iyi bir fikir mi? htmlentities() (veya htmlspecialchars()) Veritabanına veri eklemeden önce mi, sonra mı?

Önce: Yeni uzun dize, alandaki daha uzun değerler tutmak için veri tabanını değiştirmemde bana sebep olacak. (maxlength="800" 804 karakter dizisine dönüşebilir)

Sonra: Bu çok daha fazla sunucu işlemeye ve yüzlerce çağrıya ihtiyaç duyacaktır. htmlspecialchars() Her sayfa yükü veya AJAX yükünde yapılabilir.

SOOO. Sonuçlar alındığında dönüşümü kodumu önemli ölçüde yavaşlatır mı? DB'yi değiştirmeli miyim?


25
2017-12-28 18:36


Menşei




Cevaplar:


Veritabanındaki en güncel veriyi saklamanızı öneririm. Bu, verileri nasıl ve nerede çıkaracağınızı seçerken size en fazla esnekliği sağlar.

Performansın sorun olduğunu tespit ederseniz, bu verilerin HTML formatlı sürümünü bir şekilde önbelleğe alabilirsiniz. Prematüre optimizasyonun kötü bir şey olduğunu unutmayın.


33
2017-12-28 18:42



Kololayı içerim. Ama umarım yavaş yavaş olmaz. Belki sadece paranoyaksım, erken optimizasyon konusunda haklısınız. - Douglas
Bir ton olduğunda çok büyük bir acı olduğunu anladım. & veritabanında. Sonra her sorgu ya da aramada aynı formatın olması gerekir. - Captain Hypertext


Ben php deneyimim yok ama genellikle her zaman dönüşüme en yakın çıkış veya dönüşümü yaparım. Çıktı gereksinimlerinizin ne zaman değişeceğini bilmiyorsunuz, örneğin verileri XML olarak ya da JSON dizileri olarak tükenmek isteyebilirsiniz ve bu yüzden HTML için kaçınıyorsunuz ve saklamak, verileri yalnızca HTML olarak kullanmakla sınırlı olduğunuzu ifade ediyor.


11
2017-12-28 18:40



Maalesef, ilk önce veritabanına HTML koymayı ("HTML çıkışı" ile "çıktı") desteklediğini düşünmüştüm. Sanırım aynı şeyi söylüyorsun. - pix0r


Bir php / MySQL web uygulamasında, veri iki şekilde akar

Veritabanı -> komut dosyası dili (php) -> HTML çıkışı -> tarayıcı -> ekran ve Klavye-> tarayıcı-> $ _POST -> php -> SQL deyimi -> veritabanı.

Veri, kullanıcı tarafından sağlanan her şey olarak tanımlanır.

HER ZAMAN DAİMA HER ZAMAN ....

A) mysql_real_escape_string aracılığıyla bir SQL deyimine taşıdığınızda işlem verileri ve

B) HTML çıkışına taşıdığınızda htmlspecialchars aracılığıyla işlem verileri.

Bu sizi sql enjeksiyon saldırılarına karşı koruyacak ve html karakterlerini ve varlıklarını düzgün bir şekilde görüntüleyebilmenizi sağlayacaktır (bir yeri unutmayı başaramadıkça ve daha sonra bir güvenlik deliği açtınız).

Bunun, herhangi bir kullanıcının bir senaryo aracılığıyla dokunulabildiği, değiştirilebileceği veya sunabileceği her bir veri parçası için yapılması gerektiğinden bahsetmiş miydim?

Not; Performans nedeniyle, her yerde UTF-8 kodlamasını kullanın.


7
2017-12-29 00:41



zaten her üçü de yapıyor :)) ama beyninizde iyi uygulamayı yeniden uygulamak hiçbir zaman acıtmaz. yukarı + - Douglas
Bu cevabın artık oldukça eski olduğunu unutmayın. mysql_* işlevler günümüzde lehine kullanılmamalıdır PDO ile hazırlanan istekler. - aymericbeaumet


Metni ham olarak depolamak ve gerektiğinde kodlamak en iyisidir, dürüst olmak gerekirse, XSS hacklemesini önlemek için her zaman verilerinizi html olarak kodlamanız gerekir.

Verilerinizi veritabanına koymadan önce kodlamamalısınız. Ana nedeni:

  1. Eğer bu veri sütun boyutu sınırına yakınsa, 32 karakterlik bir karakter varsa, eğer başlık "Steve & Fred blah blah" ise, o zaman 1 sütun ve 5 karakterlik bir ar & amp;
  2. Verilerin her zaman bir web sayfasında görüntüleneceğini varsayıyorsunuz, gelecekte veriye nerede bakacağınızı asla bilemezsiniz ve şifrelenmesini istemeyebilirsiniz, şimdi şifresini çözmeniz gerekir ve bu sizin de mümkün olmayabilir. PHP'nin şifre çözme işlevine erişim

3
2017-12-28 18:46





Ustaların "iki kere ölçüp, bir kere optimize et" yöntemidir.


2
2017-12-28 18:39



Veya daha yaygın olarak "bir kere ölçün, hiçbir zaman optimize etmeyin" - MarkR


Web siteniz için yüksek performansa ihtiyacınız yoksa, ham veri olarak saklayın ve çıktı aldığınızda istediğinizi yapın.
Performansa ihtiyacınız varsa, bunu iki kez depolamayı düşünün: işinizle istediğiniz şeyi yapmak için ham veriler ve filtrelenmiş verilerle başka bir alan. Yedek olarak görülebilir, ancak CPU pahalı, veri depolama ise gerçekten ucuz.


2
2017-12-29 00:55



Bunu hiç düşünmemiştim bile. Bu projeyi daha önce taahhüt ettim (çevrimiçi, XD ile uğraşmak istemiyorum) ama bunu gelecekte ele alacağım - Douglas
Bu önemli "CPU pahalı, veri depolama ise gerçekten ucuz." Teşekkürler - AMB


En kolay yol, verileri "olduğu gibi" depolar ve daha sonra ihtiyaç duyulan her yerde htmlentitelere dönüştürür.

En güvenli çözüm veriyi Veritabanına girmeden önce filtrelemektir, çünkü sunucu ve veritabanınızdaki güvenlik saldırılarının olmaması nedeniyle olası saldırıları önler ve gerektiğinde ihtiyacınız olduğunda dönüştürün. Ayrıca PDO kullanıyorsanız, hazırlanan ifadeleri kullanarak sizin için otomatik olarak gerçekleşir.

http://php.net/PDO


1
2017-12-28 18:45





Son zamanlarda bu tartışmayı yaptık. Kaçak değerlerimizi veritabanına kaydetmeye karar verdik, çünkü daha önce (onu sakladığımız zamanlar), verinin kaçmadan saklandığı köşe durumları vardı. Bu XSS'ye yol açabilir. Bu yüzden güvenli olabilmek için kaçmaya karar verdik ve eğer istemek unescaped, işi kendin yapmak zorundasın.

Düzenle: Bu yüzden, aynı fikirde olmayan herkese davam için bir miktar destek yazısı ekleyeyim. Diyelim ki 50'den fazla kişiden oluşan bir ekipte çalışıyorsunuz ... ve veritabanından alınan verilerin çıkışta HTML-Kodlaması garanti edilmiyor. Bunun için yerleşik bir mekanizma yok, geliştiricinin kodu yazması gerekiyor yapmak için. Ve bu veriler her yerde gösteriliyor, bu yüzden 1 geliştiricinin kodundan geçmiyor, 30'dan geçiyor - ki bunların çoğu bu veri hakkında hiçbir fikre sahip değil (ya da nadiren bile olsa açılı ayraçlar içerebiliyordu) ve sadece bunu almak istiyor sayfada gösterilir, devam edin ve unutun.

Yapıyor musun yine Verileri HTML’de veritabanına koymak ve işleri doğru bir şekilde yapamayan rasgele insanlara güvenmek daha iyi olur mu? Açıkçası, kesinlikle sıcak-bulanık-en iyi-pratik görünmüyor olsa da, kapalı kalmayı tercih ediyorum (veri bir Word Doc içinden gelirken, Value <Stock yerine Value <Stock yerine) gibi görünüyor (yani) Word Doc hiçbir işe yaramamaktadır, ancak platformun bazı köşeleri muhtemelen XSS'e karşı savunmasız olabilir. İkisine sahip olamazsın.


-5
2017-12-28 18:43



çok kötü tavsiye. Belki bir seçeneğin olması için etrafta çok fazla özensiz kod vardı; ama genel olarak bunu yapmak yanlış bir yol. - Javier
Öncesinde kullanıcı bilgilerinin kişisel olarak görüntülenmesine izin veren süreci düzeltirim. - ceejayoz
Bu, genel olarak, diğerlerinin cevaplarında belirttikleri sebeplerden dolayı yanlıştır. Çöp dolu bir veritabanıyla bitireceksin. - MarkR
XSS için, verilerin saklanması ve kaçan verilerin saklanması arasında büyük bir karışıklık olduğunu düşünüyorum. Verileri sanitize edilmiş, ancak kaçmayan verileri saklamak istiyorsunuz. - Adam Gent
XSS ve kaçan uygulamalarla ilgili hiçbir ipucu olmayan 30 geliştiriciniz varsa ciddi bir işe alma ve / veya eğitim probleminiz var. - Martijn Pieters♦