0

私は古いサイトで作業していて、非推奨のphp関数を更新しています。次のコードがあります。これをに変更するとエラーが発生しeregますpreg

private function stripScriptTags($string) {
    $pattern = array("'\/\*.*\*\/'si", "'<\?.*?\?>'si", "'<%.*?%>'si", "'<script[^>]*?>.*?</script>'si");
    $replace = array("", "", "", "");
    return ereg_replace($pattern, $replace, $string);
}

これは私が得るエラーです:

Fatal error: Allowed memory size of 10000000 bytes exhausted (tried to allocate 6249373 bytes) in C:\Inetpub\qcppos.com\library\vSearch.php on line 403

そのコード行に、一緒に変更する必要のある他の何かがありereg_replaceますか?

4

3 に答える 3

1

したがって、正規表現は次のようになります。

"'\/\*.*\*\/'si"
"'<\?.*?\?>'si"
"'<%.*?%>'si"
"'<script[^>]*?>.*?</script>'si"

それらを一度に1つずつ取得すると、最初に複数行のコメントを貪欲に削除します。これはほぼ確実にあなたの記憶の問題が原因であるところです、あなたはその数量詞を貪欲にしないべきです。

次に、PHPタグのように見えるものをすべて削除します。これは怠惰な数量詞を使用して行われるため、問題は発生しません。ASPタグ、そして最後にスクリプトタグについても同じことが言えます。

正規表現によって除外された強力なXSSの脅威は別として、主な問題は最初の正規表現から来ているようです。"'\/\*.*?\*\/'si"代わりに試してください。

于 2012-06-22T14:12:05.853 に答える
0

メモリ制限値を取得する

 ini_get('memory_limit');

そして、 memory_get_usage()memory_get_peak_usage() (これはphp 5.2以上が必要です)でスクリプトをチェックします。 これが低すぎることが判明した場合は、次のように設定できます。

 ini_set("memory_limit","128M"); // "8M" before PHP 5.2.0, "16M" in PHP 5.2.0, > "128M"

あなたが持っているどんなメモリでも入れて、あなたのスクリプトのために働くだけです。これにより、個々のphpプロセスが制限されることに注意してください。グローバルに設定するには、php.iniファイルを調整する必要があります。明らかに、実行するのに異常な量が必要な場合は、それをモンキーパッチと見なし、メモリフットプリントを改善するために書き直しを開始します

詳細については、コアphp.iniディレクティブを参照し、リソース制限を検索してください

于 2012-06-19T21:56:20.910 に答える
0

より高いメモリ割り当てを許可することが機能していなかったため、次の関数が次のように更新されました(実際には何もしていないため、問題が発生しています)。

 private function stripScriptTags($string) 
{
/* $pattern = array("'\/\*.*\*\/'si", "'<\?.*?\?>'si", "'<%.*?%>'si",
   "'<script[^>]*?>.*?</script>'si");
   $replace = array("", "", "", "");
   return ereg_replace($pattern, $replace, $string);
*/
   return $string;
}

private function clearSpaces($string, $clear_enters = true)
{
/*$pattern = ($clear_enters == true) ? ("/\s+/") : ("/[ \t]+/");
  return preg_replace($pattern, " ", trim($string));
*/
  return $string;
}
于 2012-06-22T13:58:46.147 に答える