这是Kohana框架的Input_Core类的xss_clean方法的一段代码:
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);
Run Code Online (Sandbox Code Playgroud)
do ... while循环是否必要?我认为preg_replace调用只需一次迭代即可完成所有工作.
好吧,如果替换可能在下一次迭代中创建新的匹配项,那么这是必要的。不过,这并不是很浪费,因为在最坏的情况下,这只是一次额外的检查。
然而,根据它匹配的代码,它似乎不太可能通过替换创建新的匹配项:它对匹配的内容非常严格。
编辑:更具体地说,它尝试匹配一个左尖括号(可选)后跟一个斜杠,后跟几个关键字之一(可选)后跟任意数量的不是右尖括号的符号,最后是右尖括号。如果输入遵循该语法,它将被整个吞下。如果它格式错误(例如多个左尖括号和右尖括号),它将生成垃圾,直到找不到与初始序列匹配的子字符串为止。
所以不行。除非您有类似的代码<<iframe>iframe>,否则不需要重复。但是,您正在处理一定程度的标签汤,正则表达式无论如何都不够好(例如,它会< iframe>因为额外的空间而失败)。
EDIT2:模式与标签开头的零个或多个斜杠匹配(应该是零或一个)也有点奇怪。如果我的正则表达式知识不是太生疏,那么final*+也没有多大意义(星号意味着零个或多个,加号意味着一个或多个,也许这是一种贪婪的语法或类似的花哨的东西?)。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |