0

我已经研究这个问题几个小时了,并将其缩小到这几行代码。我知道代码并不完美,但这是我必须从开发人员那里得到的。该脚本应该过滤掉潜在的恶意代码。但问题是,每当有人使用特殊字符(例如 á、ñ、ö 等)时,字符串似乎就会变为空。

例如,如果有人写“viva españa”,则字符串为空。

如果有人写“viva espana”(没有 ñ),那很好。

其他特殊字符也是如此。这可能是什么原因造成的?我对正则表达式的了解几乎为零,所以它对我来说有点像垃圾,但我所知道的是,当我注释掉这些行时,脚本在字符串中带有和不带有特殊字符的情况下以及我取消注释的那一刻都有效它们,它只能在字符串中没有特殊字符的情况下工作。

有任何想法吗?

这些是代码行:

  $string = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u', "$1;", $string);
  $string = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $string);
  $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])(on|xmlns)[^>]*>#iUu', "$1>", $string);

  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2nojavascript...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2novbscript...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*-moz-binding[\x00-\x20]*:#Uu', '$1=$2nomozbinding...', $string);
  $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*data[\x00-\x20]*:#Uu', '$1=$2nodata...', $string);

  $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])style[^>]*>#iUu', "$1>", $string);
4

1 回答 1

0

我建议不要使用u. 该标志指定字符串为 Unicode,但您只使用 ASCII 范围内的字符串。

于 2012-06-23T15:37:28.013 回答