Nasıl bir web uygulamasında tüm çıktıyı Encode HTML mi?

11 Cevap php

Benim web uygulaması XSS ​​saldırıları önlemek istiyoruz. Ben HTML Kodlama çıktı gerçekten XSS saldırıları önlemek olabilir bulundu. Şimdi sorun nasıl benim uygulamada her çıktı kodlamak HTML olmasıdır? Orada bu otomatik bir yolu?

JSP, ASP.net ve PHP cevaplar için teşekkür ederiz.

11 Cevap

Eğer sadece çıktılıyorsanız herhangi bir kullanıcı girişi kodlamak HTML istiyorum, tüm HTML kodlamak istemiyorum.

PHP için: htmlentities ve htmlspecialchars

Eğer shouldn't yapmak Bir şey kolay çözüm beri İnsanlar genelde, bu tavsiye içeri geliyor gibi girdi verilerini filtre, ama sorunlara yol açar.

Giriş verileri HTML olarak çıktı olmanın yanı sıra, birden fazla yerlere gönderilebilir. Bu, örneğin, bir veri tabanında depolanabilir. Bir veritabanına gönderilen verilere filtre uygulanması için kurallar filtreleme HTML çıkışı için kuralları çok farklı. Girilecek her şeyi HTML-kodlamak, sizin veritabanında HTML ile bitireceğiz. (PHP'nin "sihirli tırnak" özelliği kötü bir fikir olduğunu nedeni de budur.)

Eğer veri girişi seyahat edecek tüm yerleri tahmin edemez. Güvenli yaklaşım just before bir yere gönderilen verileri hazırlamaktır. Bir veritabanına göndererek iseniz, tek tırnak kaçış. HTML çıktısı ediyorsanız, HTML varlıkları kaçış. Ve hala, verilerle çalışmak orijinal un kaçtı sürümünü kullanmanız gerekiyorsa o, bir yere gönderdi bir kez.

Bu daha fazla iş, ancak şablon motorları ya da kütüphaneleri kullanarak bunu azaltabilir.

JSPs için, size kek ve c, çok yemek: dışarı etiketi, varsayılan olarak XML kaçar. Bu ham elemanları gibi özelliklere bağlamak anlamına gelir:

<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" />

Bir dize bağlı olduğunda, someName.someProperty XML girişi içerecek, ancak sayfa çıkış olarak, otomatik olarak XML girdileri sağlamak kaçtı olacaktır. Bu sayfa doğrulama için bağlantılar için özellikle yararlıdır.

Ben tüm kullanıcı girişi kaçmak için kullanılan güzel bir yolu smarty wich için bir değiştirici şablona geçti tüm değişkenleri kaçar yazarak; unescape ona bağlı | zorunda olanlar hariç. Bu şekilde sadece HTML açıkça erişim vermek elemanlara erişim sağlar.

Ben herhangi bir daha o değiştirici yok; ama yaklaşık aynı sürüm burada bulabilirsiniz:

http://www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html

Yeni Django 1.0 sürümünde bu tam olarak aynı şekilde, Jay çalışır :)

Eğer o çıktıyı kaçmak için kullanabileceğiniz kendi yöntemleri echo / print vb sarın. yani yerine

echo "blah";

kullanmak

myecho('blah');

Hatta eğer ihtiyacınız kaçan kapanır ikinci bir param olabilir.

Bir projede tüm çıkış metin bizim yöntemle görünmez geçiyor yapılan bizim çıkış fonksiyonları bir hata ayıklama moduna vardı. Sonra ekranda kalan bir şey kaçtı olmasaydı biliyordu! O yaramaz çıkmamış bitleri aşağı izleme çok yararlı oldu :)

Aslında HTML kodlamak her tek çıkışı yaparsanız, kullanıcı < html > düz metin göreceksiniz yerine işleyen bir web uygulaması.

EDIT: kodlamak her giriş HTML ise, içeren harici şifreyi kabul sorununuz olacak < vb.

Benim kişisel tercihi özenle anything Bu veritabanı, iş katmanı veya kullanıcı geliyor kodlamak için.

ASP.Net Bu Server.HtmlEncode(string) kullanılarak yapılır.

Öylesine bir şey kodlamak nedeni mantıksal ya da sayısal olarak kabul olabilir hatta özellikleri (kötü niyetli kod içerebilecek olmasıdır Örneğin, onay değerler, onlar yanlış bittiyse dizeleri olarak geri geliyor olabilir. Önce bunları kodlayan değilseniz kullanıcıya çıktı göndermeden, daha sonra) bir güvenlik açığını var.

Gerçekten saldırı bu tür karşı kendinizi korumak için tek yolu titizlikle uygulamanın kamu alanlarından size özel, kabul girdi her ne kadar (tamamen değil) filtre etmektir. Ben Daniel Morris'in PHP Filtering Class (tam çözüm) ve aynı zamanda Zend_Filter paketi (kendi filtre oluşturmak için kullanabileceğiniz sınıfları bir toplama) bakmak öneriyoruz.

PHP web geliştirme söz konusu olduğunda tercih benim dilidir, yani benim cevap önyargı için özür dilemek.

Kieran.

Macar notasyonu doğru kullanımını örtülü yazılım Joel iyi bir deneme (bence yanlış kod bakmak yanlış yapıyor, ben telefonla konuşuyorum yoksa ben senin için bir URL olurdu) oldu. Kısa versiyonu gibi bir şey olurdu:

Var

dsFirstName, uhsFirstName: String;

Başlamak

uhsFirstName: = request.queryfields.value ['Isim'];

dsFirstName: = dsHtmlToDB (uhsFirstName);

Temelde güvenli HTML, veritabanı güvenli, "hs" için güvensiz dizesi, "ds" için "bizim" gibi bir şey ile değişkenleri önek. Sadece kodlamak ve aslında her şeyi öyle değil gereken yere çözmek istiyoruz. Bir şey doğru değil ama eğer onlar koduna bakarak yararlı bir anlam çıkarabiliriz önek kullanarak gerçek çabuk görürsünüz. Ve gong zaten farklı kodlama / kod çözme fonksiyonları gerekir.

OWASP (bir form reddetme sonra <input> etiketleri için örneğin) HTML, metin (örneğin paragraf veya <textarea> içeriği) veya bir niteliğin değeri olarak kullanmak ya, HTML çıktı kodlamak için güzel bir API vardır :

encodeForHTML($input) // Encode data for use in HTML using HTML entity encoding
encodeForHTMLAttribute($input) // Encode data for use in HTML attributes.

Projesi (PHP version) http://code.google.com/p/owasp-esapi-php/ altında barındırılan ve örneğin, bazı diğer diller için de geçerli olduğunu . NET.

Eğer everything (kullanıcı girişi değil) kodlamak, ve as late as possible (DB saklarken ancak HTTP yanıtı çıktısı zaman değil) gerektiğini unutmayın.

Çıktı kodlama tarafından çok iyi savunmadır. Girişini doğrulayarak birçok nedenden dolayı büyük değil, ama% 100 savunma. Bir veritabanı saldırı (yani ASPROX) üzerinden XSS ile enfekte olursa, hata veya maliciousness giriş doğrulama hiçbir şey yapmaz. Çıktı kodlama çalışmaya devam edecektir.