2011-05-04 14 views
12

jspx'i şablon motoru olarak kullanıyoruz. $ {User.firstName} veya "$ {mail.subject}" gibi yüzlerce el ifadesi içeren bir düzine ekranımız var.JSP/JSPX'deki HTML varlıklarından kaçış: Var olmayan bir sorun için çözüm yok mu?

Tüm bu HTML kodları varsayılan olarak kaçmıyor. . - alanında "Orada < bir şey olabilir ya istiyorsanız ekran başarısız olur Biz her zaman fn kullanabilirsiniz: escapeXML ama gerçekten sıkıcı her yerde bunu yaparken

1) mu varsayılan olarak kaçış yapmak için bir yolu yoktur. ?

bildiğim tek yolu (tomcat için jasper gibi) JSP derleyici kesmek etmektir. Ama gitmek için bir yol değildir.

birileri el içinde kaçamayan HTML ihtiyaç her zamankinden olabilir Neden

2) ? saklanması HTML şablonun dışında (örneğin veritabanında) iyi bir uygulama yoktur.) Eminim, şablon motorunun otomatik olarak (XSLT'de yapıldığı gibi) ele alması gerektiğinden eminim, neden kullanıcı bunu önemsemeli? El ile kaçma (fn: escapeXml), SQL el ile kaçma (JDBC setParam yerine kullanılan) gibi kokuyor: sql-injection için boilerplate kodu ve iyi bir yer (bizim durumumuzda siteler arası komut dosyası oluşturma).

cevap

10

1) Varsayılan olarak kaçış yapmanın bir yolu var mı?

Eski JSP'de yok. Ancak halefi Facelets, bunları varsayılan olarak çıkarır. Kaçışı devre dışı bırakmanın tek yolu, #{bean.foo} yerine <h:outputText value="#{bean.foo}" escape="false" /> kullanmaktır.


2) Neden biri hiç el içinde kaçamayan HTML gerekebilir? HTML'yi şablonun dışında saklamak (örneğin veritabanında) iyi bir uygulama değildir. sanitized HTML saklanması

yaygın yapmaktan daha ancak daha fazladır. Örneğin. <p>, <b>, <i> ve on* özniteliklerinin zaten kaldırıldığı gibi küçük bir masum HTML etiketlerinin alt kümesine izin vermek için.


3) Ben XSLT'de tamam olarak şablon motoru (otomatik olarak işlemesi gerektiğini eminim) bu konuda niye kullanıcı bakımı? El ile kaçma (fn: escapeXml), SQL el ile kaçma (JDBC setParam yerine kullanılan) gibi kokuyor: sql-injection (bizim durumumuzda çapraz site komut dosyası) için boilerplate kodu ve iyi bir yer.

JSP eski bir görüntüleme teknolojisidir. Bu gerçekten esnek bir şablon motoru değil. senin XSS sorunu sadece MVC framework kullanarak yerine "ham tarafından önlenebilir olarak benzeri

SQL enjeksiyonu, genellikle sadece yerine Statement ait PreparedStatement (kullanarak veya yerine "ham JDBC" nin bir ORM framework kullanarak engelledi edilmelidir JSP ").

  1. Sık dişini ve kullanıcı kontrollü girişini yeniden görüntüler tüm EL-in-şablon metni:


    somut sorununa gelince, temelde 4 yollarla bu çözebilir fn:escapeXml() ya da <c:out> ya da kendinize ve ekibinize gelecekte buna dikkat etmeniz için öğretin. İpucu, Eclipse gibi biraz iyi bir IDE, regex tabanlı tüm dosyaları bul ve değiştir.

  2. DB'ye yerleştirmeden önce kötü amaçlı HTML'yi kesen bir çeşit DB engelleyicisi var. Gerekirse mevcut verileri dezenfekte etmek için bir DB betiği çalıştırın. Ancak bu, gerçek bir çözümden daha fazla bir çözümdür.

  3. JSP EL çözümleyicisini, tüm HTML’lerden kurtulan özel bir yöntemle değiştirin. Ancak bu, dezavantaj olarak, gerçekten ihtiyaç duyulduğunda, EL ile düz HTML gösterememenizdir.

  4. Yerleşik HTML kaçışıyla iyi bir MVC çerçevesi kullanın. Ancak bu, bireysel EL ifadelerini düzeltmekten daha fazla iştir.

+0

Teşekkürler! Biz struts + jspx kullanıyoruz, yüzleri kullanmak istemiyoruz - bu farklı bir teknolojidir. 1) intellij fikrini kullanıyoruz ve tüm elementleri değiştirebiliyoruz ama bu şekilde sevmiyoruz. 2) kaçmak VIEW meselesidir ve veritabanında değil, görünüm katmanında çözülmelidir. 3) Bunu yapmak için kapsayıcımı kesmem gerekiyor. Özel ELResolver'imi kaydedebilirim ancak zincirde kullanacağım, diğer tüm çözücüleri devre dışı bırakamıyorum ya da kapatamıyorum (hatta onlara bile işaret bile edemiyorum - JSP EL API'si çok kötü). 4) Destekleri kullanırız. Jsp görünümlerini çözmek için ServletDispatcher'ı kullanır. Biz onun EL ile oynayabiliriz ama ben –

+1

çalışır emin değilim, sonra mermi ısırmak. Bunun için ödeme aldın. Bir dahaki sefere dersi öğren. – BalusC

+0

JSP'yi kullanmamanın, Scalate, Velocity veya Freemaker gibi farklı bir görüntüleme teknolojisinin eklenmesini ekleyebileceğiniz 5. bir seçenek olduğunu düşünüyorum. Bu şablon dilleri için çapraz kesim yapmak daha kolaydır. –