2010-03-06 15 views
5

Oto fragment kodu z xss_clean metody klasy Input_Core ram Kohana:Czy wymagana jest iteracja w poniższym kodzie?

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); 

Czy pętla do ... while konieczne? Myślę, że wywołanie preg_replace wykonałoby całą pracę w jednej iteracji.

Odpowiedz

3

Cóż, jest to konieczne, jeśli zamiennik potencjalnie tworzy nowe dopasowania w kolejnej iteracji. Nie jest to zbyt marnotrawstwem, ponieważ jest to jedyny i dodatkowy czek w najgorszym.

Przechodząc po kodzie, który pasuje, wydaje się mało prawdopodobne, że utworzy nowe dopasowania przez zastąpienie, jednak: jest bardzo ścisły o tym, co pasuje.

EDYCJA: Bardziej szczegółowo, próbuje dopasować nawias otwierający opcjonalnie, po którym następuje ukośnik, po którym następuje jedno z wielu słów kluczowych, po którym ewentualnie następuje dowolna liczba symboli, które nie są nawiasami zamykającymi, a wreszcie nawiasami zamykającymi . Jeśli dane wejściowe będą zgodne z tą składnią, zostanie ona połknięta w całości. Jeśli jest zniekształcony (na przykład wiele nawiasów otwierających i zamykających), generuje śmieci, dopóki nie będzie w stanie znaleźć ciągów pasujących do początkowej sekwencji.

Tak, nie. Jeśli nie masz kodu takiego jak <<iframe>iframe>, powtórzenie nie jest konieczne. Ale wtedy masz do czynienia z poziomem zupy tagów, ale wyrażenie regularne nie jest wystarczająco dobre (np. Nie powiedzie się na < iframe> z dodatkową przestrzenią).

EDIT2: To również trochę dziwne, że wzór pasuje do zero lub więcej ukośników na początku tagu (powinien wynosić zero lub jeden). A jeśli moja wiedza na temat regex nie jest zbyt zardzewiała, ostateczny *+ również nie ma większego sensu (gwiazdka oznacza zero lub więcej, plus oznacza jeden lub więcej, może to chciwa składnia lub coś takiego?).

2

Na zupełnie niepowiązanym temacie, chciałbym dodać słowo o optymalizacji tutaj.

preg_replace() może powiedzieć, czy dokonano zamiany (patrz 5 argument, który jest przekazywany przez odniesienie). Jest o wiele wydajniejszy niż porównywanie łańcuchów, zwłaszcza jeśli są duże.

Powiązane problemy