2010-03-06 25 views
5

Dưới đây là một đoạn mã từ phương pháp xss_clean của lớp Input_Core của khuôn khổ Kohana:Lặp lại có cần thiết trong đoạn mã sau không?

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

Là do ... while loop cần thiết? Tôi nghĩ rằng cuộc gọi preg_replace sẽ làm tất cả công việc chỉ trong một lần lặp.

Trả lời

3

Vâng, cần thiết nếu thay thế có khả năng tạo ra các kết quả trùng khớp mới trong lần lặp tiếp theo. Nó không phải là rất lãng phí bởi vì nó chỉ và kiểm tra thêm tại tồi tệ nhất, mặc dù.

Đi theo mã phù hợp, có vẻ như không chắc sẽ tạo ra các kết quả trùng khớp mới bằng cách thay thế, tuy nhiên: nó rất nghiêm ngặt về nội dung phù hợp.

CHỈNH SỬA: Cụ thể hơn, nó cố gắng khớp với một dấu ngoặc nhọn mở theo sau một dấu gạch chéo theo sau là một trong nhiều từ khóa được theo sau bởi bất kỳ số biểu tượng nào không phải là một góc ngoặc đóng và cuối cùng là một khung góc đóng . Nếu đầu vào theo cú pháp đó, nó sẽ bị nuốt chửng toàn bộ. Nếu nó không đúng định dạng (ví dụ: nhiều dấu ngoặc nhọn mở và đóng), nó sẽ tạo ra rác cho đến khi nó không thể tìm thấy các đoạn mã khớp với chuỗi ban đầu nữa.

Vì vậy, không. Trừ khi bạn có mã như <<iframe>iframe>, không cần lặp lại. Nhưng sau đó bạn đang đối phó với một mức độ tag súp regex là không đủ tốt cho anyway (ví dụ như nó sẽ thất bại trên < iframe> với không gian thêm).

EDIT2: Cũng hơi lạ khi mẫu khớp với không hoặc nhiều hơn bị cắt ở đầu thẻ (số này phải bằng 0 hoặc 1). Và nếu kiến ​​thức regex của tôi không quá tệ, thì *+ cuối cùng cũng không có ý nghĩa gì nhiều (dấu sao có nghĩa là 0 hoặc nhiều hơn, dấu cộng có nghĩa là một hoặc nhiều hơn, có thể đó là một cú pháp tham lam hoặc thứ gì đó lạ mắt như thế?).

2

Về một chủ đề hoàn toàn không liên quan, tôi muốn thêm một từ về tối ưu hóa tại đây.

preg_replace() có thể cho bạn biết liệu thay thế đã được thực hiện hay chưa (xem đối số thứ 5, được chuyển qua tham chiếu). Nó hiệu quả hơn nhiều so với các chuỗi so sánh, đặc biệt nếu chúng lớn.

Các vấn đề liên quan