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 に答える