2010-03-06 17 views
5

İşte Kohana çerçevesinin Input_Core sınıfının xss_clean yönteminden bir kod parçası:Aşağıdaki kod parçasında yineleme gerekli mi?

do 
{ 
// Remove really unwanted tags 
$old_data = $data; 
$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data); 
} 
while ($old_data !== $data); 

Döngü gerekli mi? Preg_replace çağrısının tüm çalışmaları sadece bir yinelemeyle yapacağını düşünürdüm.

cevap

3

Eh, bu gerekli. Çok da savurgan değil, çünkü sadece ve en kötü ihtimalle ek kontrol. eşleştiği kodu ile gidiş

, bunun ancak, yerine yeni eşleşmeleri yaratacak olası görünüyor: o maçları konusunda çok katı.

DÜZENLEME: Daha açık olması gerekirse, isteğe bağlı olarak bir eğik çizgiyle izleyen bir açılı açılı ayraçla eşleşmeye çalışır, ardından isteğe bağlı olarak bir kapanış açılı ayraç olmayan ve son olarak bir kapanma açılı ayraç olmayan herhangi bir sayıda sembolün izlediği birkaç anahtar sözcüğün biriyle eşleşir. . Giriş sözdizimini takip ederse, tüm yutulur. Bozuksa (ör. Çoklu açma ve kapama açılı ayraçlar), artık ilk diziyle eşleşen alt dizeleri bulana kadar çöp üretecektir.

Yani, hayır. <<iframe>iframe> gibi bir kodunuz yoksa, tekrarlama gerekmez. Ama sonra bir etiket çorbası seviyesi ile uğraşıyorsunuz, regex zaten yeterince iyi değil (örneğin, ekstra alanla < iframe>'da başarısız olacaktır).

EDIT2: Ayrıca, desenin başlangıcındaki sıfır veya daha fazla kesik çizgiyle eşleşmesi de biraz gariptir (sıfır veya bir tane olmalıdır). Benim düzenli ifade bilgisi çok paslı değilse Ve, son *+ (yıldız sıfır veya daha fazla artı bir veya daha fazla, belki bir açgözlü sözdizimi veya böyle süslü bir şey anlamına gelir?) ya çok mantıklı değil. tamamen ilgisiz bir konuda

2

, burada optimizasyonu bir kelime eklemek istiyorum.

preg_replace(), değiştirilmiş olup olmadığınızı söyler (referans ile iletilen 5. bağımsız değişkene bakın). Özellikle büyükse dizeleri karşılaştırmaktan çok daha verimli.