2012-06-23 58 views
0

我一直在調查這個問題幾個小時,並縮小到這幾行代碼。我知道代碼並不完美,但這正是我需要從開發人員那裏得到的。腳本應該過濾掉潛在的惡意代碼。但問題在於,只要有人使用特殊字符(如á,ñ,ö等),字符串似乎變空了。例如,如果有人寫道「vivaespaña」,字符串將變空。php preg_replace與#U似乎將帶有特殊字符的字符串轉換爲空字符串

如果有人寫道「非凡西班牙人」(沒有ñ),這一切都很好。

其他特殊字符也是如此。什麼可能導致這個?我幾乎沒有關於正則表達式的知識,所以這對我來說有點像垃圾,但我知道的是,當我註釋掉這些行時,腳本既可以在字符串中使用也可以不使用特殊字符,當我取消註釋時它們只能在字符串中沒有特殊字符的情況下工作。

任何想法?

這些代碼行:

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

回答

0

我不會使用u建議。該標誌指定該字符串採用Unicode,但您只能使用ASCII範圍內的字符串。

+0

哇,真的那麼簡單嗎?我剛剛從行中刪除了這個小「u」,現在它似乎工作。那麼#iUu呢?我只是將其更改爲#iU?我不知道「U」和「u」之間的區別:) – user1227914

+0

大寫字母「U」表示量詞默認是不確定的。這將徹底改變正則表達式的工作方式,因此刪除它將是一個糟糕的主意。 –

相關問題