Eminim çıkış verileri geçerli bir UTF-8 yapmak gerekir mi?

4 Cevap php

Ben çıkış UTF-8 olduğunu söyleyen bir web sitesi var, ama emin olun asla. Ben (geçersiz dizileri bırakarak) UTF-8 UTF-8 dönüştürmek için normal bir ifade veya Iconv kütüphane kullanmalı mıyım? Bunu yapmazsanız, bu bir güvenlik sorunu var mı?

4 Cevap

Dediğiniz gibi, bu geçersiz karakter yol açacak, çünkü her şeyden önce ben sadece körü körüne UTF-8 olarak kodlamak asla (muhtemelen) ikinci kez. Ben kesinlikle içeriğin charset not UTF-8 gibi bir şey denemeden önce olup olmadığını algılamak için çalışacağını söyledi.

Söz konusu içerik bir kaynaktan gelen İkincisi eğer üzerinde kontrol ve UTF-8 veya tablolarında kullanım ve bağlantı UTF-8 ile bir veritabanı ile bir dosya olarak için charset kontrol wich, ben bu kaynağı güven olur bir şey vermedikçe ben yapamam ki ipuçları ve devam korkak bir şey var. Içerik kontrolü dışında fazla veya daha az rastgele yerlerden geliyor ise, iyi bir neden daha incelemek ve muhtemelen bunu algılayabilir eğer yeniden kodlamak og Diğer karakter gelen dönüştürmek için denemek için. Yani alt çizgi: Duruma göre değişir.

Bu bir güvenlik sorunu olduğunu wether ya da değil gibi ben (en azından ben bu işletilebilir olabilecek herhangi senaryolar düşünmek değil) öyle olmaz ama ben bu konuda kesin olmak için başkalarına bırakacağım.

Eğer geçersiz UTF-8 bayt akışları göndermek eğer bir güvenlik sorunu, ancak kullanıcılar (özellikle İngilizce konuşan) değil, çok rahatsız olacak.

Iyi durumda (çoğu tarayıcılar ne) tüm geçersiz dizeleri sadece kaybolur ya da anlamsız gibi göstermek. Kötü durumda tarayıcı "geçersiz kodlama" gibi bir şey sayfanızı yorumlama çıkar ve der ki. Yani, örneğin, Linux üzerinde bazı metin editörleri (yani gedit) ne olduğunu.

Tamam, gerçekçi tutmak: Eğer ağır bir matematik karakter veya Unicode oklar dayanmadan bir İngilizce-merkezli bir web siteniz varsa, hemen hemen hiçbir fark yaratacak. Eğer hizmet Ama eğer, örneğin, bir Çince site, tamamen o kadar berbat edebilir.

Alkış,

Herkes berbat karakter kümelerini alır, bu yüzden genellikle herhangi bir dış kaynak güven olamaz. Bu sağlanan giriş gerçekten kullanmak iddia charset için geçerli olduğunu doğrulamak için iyi bir uygulamadır. Neyse ki, UTF-8 ile, geçerliliği hakkında oldukça güvenli bir iddiayı yapabilirsiniz.

Kullanıcıların keyfi bayt göndermek için mümkün ise, o zaman evet, geçerli utf8 çıkışı sağlamak değil güvenlik etkileri vardır. Veri depolamak nasıl bağlı olsa da, birlikte çalıştığı input (örneğin, o this SQL injection attack bir varyantını yaratmak mümkün geçerli utf8 veri sağlamak değil güvenlik etkileri de vardır utf8 giriş utf8 geçersiz utf8) izin, bu yüzden gerçekten iconv girişi utf8 utf8 dönüştürmek için kullanıyor olmalıdır, ve sadece çıktısında utf8 doğrulama bütün sorunu önlemek eğer.

Eğer çıkış geçerli utf-8 olduğunu kontrol etmek istediğiniz iki ana güvenlik nedeni "gereğinden fazla" bayt dizileri önlemek için - gibi bazı karakter anlamına bayt dizileri yani, vaka '<' ama kodlanmış olan Birden fazla bayt - ve geçersiz bayt dizileri önlemek için. Overlong kodlama sorunu açıktır - eğer filtre değişimi '<' &lt; 'bu bir dizi dönüştürmek olmayabilir içine means' {[(0 olduğunu )]} 'ama farklı yazılır. Tüm güncel nesil tarayıcılar geçersiz olarak overlong dizileri işaretler, ancak bazı insanlar eski tarayıcılar kullanıyor olabileceğini unutmayın.

Geçersiz dizileri ile sorun bazı utf-8 ayrıştırıcılarda geçersiz dizisi geçersiz olanları izleyin geçerli bayt bazı sayısını yemek sağlayacak olmasıdır. Yine, herkes her zaman bir sorun güncel bir tarayıcı var, ama eğer ...